クラスを継承するか、変数に入れて持ち回すか?

このQ&Aのポイント
  • クラスを継承するか、変数に入れて持ち回すかについて悩んでいます。
  • PHPRequestというクラスを作り、ヘッダー情報を取得するために使用しています。
  • 2つの方法を試してみましたが、速度に差は感じないため、正しい方法はどちらなのか教えてください。
回答を見る
  • ベストアンサー

クラスを継承するか、変数に入れて持ち回すか?

掲示板のような仕組みを作っています。 そこで、とりあえず先にHPのヘッダーをと思いPHPRequestというクラスを作りました ユーザーエージェントを元に、Doctypeや文字コード、アクセスしたディレクトリ情報が入っているものです これをヘッダーに継承させるか、変数に放り込んで掲示板の方にも使い回しするかで悩んでいます。 リクエスト class PHPRequest { function PHPRequest() { xxxxx } } ******************************** パターンA class PageHeader extends PHPRequest { } class BBS extends xxxxx { function BBS() { $request = new PHPRequest; } } ******************************** パターンB $request = new PHPRequest; class PageHeader { function PageHeader($request) { $this->xxxx=$request; } } class BBS extends xxxxx { function($request) { $this->xxxx = $request; } } どちらの使い方が正しいのでしょうか? 二通りのやり方をやってみましたけど、特段速度に差があるようにも思えないんです… クラスの考え方が基本的に間違えてるっていうことでしたら、間違えてると言ってくださった方がスッキリします どうも気になって先に進めないので教えてください! お願いします!

noname#14955
noname#14955
  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

私の覚えた大雑把な選び方として、 英語で「X is Y.」と言えるのなら、 class X extends Y 英語で「X have Y.」と言えるのなら、 class X {  Y メンバ … という分類方法です。 -- PHPは詳しくないのと、PageHeader、PHPRequestの実装が分からないので何とも言えませんが、質問者さんの想定するPageHeader、PHPRequestの機能を前提にして、 「PageHeader is PHPRequest.」 「PageHeader have PHPRequest.」 の2つの文で変な方、意味の通る方は判断できませんか? -- > アクセスしたディレクトリ情報が入っているものです ヘッダーがこれを継承したり持っちゃうと、ボディの方は何を持てばいいの?ヘッダーと不整合しない?って気がするので、ヘッダには関連付けなくても良いように思うんですが。 遭えて書くと、 class BBS extends PHPRequest {  PageHeader ヘッダ  PageBody ボディ } とか?

noname#14955
質問者

お礼

ありがとうございます! 多分分かった気がします 朝から熱が出て、ちょっとうまく判断できないので 明日もう一度じっくり読ませて貰います <(_ _)> それで締め切りますので…すみません

関連するQ&A

  • 抽象クラスを継承した普通のクラスから、

    抽象クラスを継承した普通のクラスから、 抽象クラス内でprotected宣言したクラスのフィールド(連想配列)へ データをセット&ゲットしてみたいのですが、やり方がよく分かりません。 上記内容を満たす簡単なサンプルを誰か作っていただけないでしょうか。 ちなみに、下記は、自分でやろうとして、頭がこんがらがってしまった例です。 あくまでもイメージですが、 こんな感じで、作成していただけると、うれしいです。 <?php abstract class A1{ protected $data = array();   public function setData($value){ $this->data[$key] = $value; } public function getData($key = null){ if (null == $key) { $this->data; } else { $this->data[$key]; } } } class C1 extends A1{ public function main(){ $this->setData('key1') = 'value1'; $this->setData("キー2") = "値2"; } } $c1 = new C1; $c1 -> main(); var_dump($data); ?>

    • ベストアンサー
    • PHP
  • クラスで永続的な値を持たせたい

    親クラスが保持している値(ここではID)を維持して それぞれの子クラスが利用できるようにしたいのですが、 次のようなやり方だと維持できないようです。 どのようにすればクラスを利用する場合に永続的な値を 持たせることができるのでしょうか? class oya {  var $ID = 0;  function setID($ID) { $this->ID = $ID; }  function getNextID() { return $this->ID + 1; } } class sub1 extends oya {  function sub1 () {$this->setID($this->getNextID());} } class sub2 extends oya {  function sub2 () {$this->setID($this->getNextID());} } $sub1 = new sub1();//←IDが1になる $sub2 = new sub2();//←希望としてはIDが2になってほしいが、IDは1

    • ベストアンサー
    • PHP
  • PHPのクラス継承において質問

    class SuperClass{ public function getSuperClassName (){ //操作中のオブジェクトのクラス名を取得する print get_class($this); print "<br />"; print __CLASS__; } } class SubClass extends SuperClass{ public function getSubClassName (){ //操作中のオブジェクトのクラス名を取得する print get_class($this); print "<br />"; print __CLASS__; } $obj = new SubClass(); print "<br />"; $obj -> getSuperClassName(); print "<br />"; $obj -> getSubClassName(); 上記のようなコードがあった場合、 出力結果は SubClass SuperClass //継承しているにもかかわらず、SuperClassという文字列が返る。 SubClass SubClass と上記のようになります この結果に一点疑問があるのですが、親クラスのメソッドは子クラスに継承されるんですよね? であれば親クラスの public function getSuperClassName (){ //操作中のオブジェクトのクラス名を取得する print get_class($this); print "<br />"; print __CLASS__; } の箇所の print __CLASS__; の記述箇所はSubClassとでなければいけないような気がします。 しかし結果はSuperClassとでますが、このメソッドは子クラスに継承されていないのですか? publicなら継承されるとマニュアルにかいてありましたが、どうなっているのでしょうか よろしくご教授御願い致します。

    • ベストアンサー
    • PHP
  • static変数を持ったクラスを継承した複数のクラスで、独立してその変

    static変数を持ったクラスを継承した複数のクラスで、独立してその変数を使いたい。 例えば、 class AbstractStatic{ public static String str; } class Ex1 extends AbstractStatic{} class Ex2 extends AbstractStatic{} というクラスがあったとして、 Ex1 e1 = new Ex1(); ex1.str = "hoge"; といれると、 ex2.str で、hogeが入ってしまいます。同じようなstatic変数を持つクラスを複数作りたいのですが、継承させると、独立して変数を持たせられません。 同じようなクラスに直接static変数を、記述するしかないのでしょうか?

    • ベストアンサー
    • Java
  • 継承クラスで定義したメソッドのtry-catch文

    親クラスで、子クラスで実装されたメソッドのExceptionをキャッチしたいのですが、 うまくいきません。 何か良い方法はないでしょうか? abstract class A { public __construct(){ try{ $this->testA(); }catch(Exception $e){ var_dump(1); } } abstract function testA(); } class B extends A { function testA(){ throw Exception('test',1); } } try{ new B; }catch(Exception $e){ var_dump(2); // こっちが動く } よろしくお願いします。

    • ベストアンサー
    • PHP
  • クラス継承 メンバ引継ぎとprivateについて

    「クラス継承時のメンバ引継ぎの意味」と、 「privateでオーバーライドさせた際の挙動」ついて教えてください。 class Pa{  private $level="10";  public function getLevel(){   return $this->level;  } } class Ch extends Pa{  protected $level="5"; } $ch = new Ch(); echo $ch->getLevel(); このとき、$ch->getLevel();は、 Paクラスのメソッドをchオブジェクトで見に行ってるのでしょうか? それとも、Chクラスに引き継がれたメソッドを見に行っているのでしょうか? また、このときの「$this」「$this->level」は、それぞれ何を意味しているのでしょうか? また、このときの、Chクラスの「$level」は、どういう状態(扱い)になっているのでしょうか? エラーにならないのですが、再定義扱いされないのでしょうか? 新定義扱いされてるってことでしょうか? 「privateメンバを継承した際」、どういう動きをするのか(ルールになっているのか)教えてください。

    • ベストアンサー
    • PHP
  • 変数の継承について

    初めまして。最近、独習Javaで勉強を始めた者です。ゆっくりながら継承の所まで進みました。 abstract class Monster{ String monster; } class Vampire extends Monster{ String monster = "Vampire"; } class Zombie extends Monster{ String monster = "Zombie"; } class NewSougou3{ public static void main(String args[]){ Vampire vam = new Vampire(); Zombie zom = new Zombie(); Monster array[] = new Monster[2]; array[0] = vam; array[1] = zom; for (int i = 0 ; i < 2 ; i++){ System.out.println(array[1].monster); } } } というプログラムを作ったのですが、実行すると"null"が二つ出てきただけで正しい"Vampire"と"Zombie"が表示されません。Monsterクラスで定義したmonsterの値(既定)が表示されていると思うのですが、Monster型で宣言した配列にVampire、Zombieクラスをインスタンス化して代入してもそれは反映されないのでしょうか?スーパークラスであるMonsterクラスで変数monsterを宣言し、二つのクラスをインスタンス化した時に変数monsterにそれぞれの値が代入されると思ったのですが… なにぶん始めたばかりなので見当違いのことを質問しているかもしれません。その辺はお許し下さい。よろしくお願いします。

    • ベストアンサー
    • Java
  • クラスメンバ・メソッドは継承しない?

    クラスのインスタンスオブジェクトで不変なクラスメンバとメソッドを定義したいのですが、継承クラスでエラーが出ます。 -------------------------------------------------------------------ここから function baseClass() { this.instStr = "base class instance property"; } baseClass.prototype.prtMethod = function(){return this.instStr;}; baseClass.clsStr = "base class property"; baseClass.clsMethod = function(){return baseClass.clsStr;}; base_inst = new baseClass(); alert( "baseClass:\n" + "\tinstStr = " + base_inst.instStr + "\n" + "\tprtMethod = " + base_inst.prtMethod() + "\n" + "\tclsStr = " + baseClass.clsStr + "\n" + "\tclsMethod = " + baseClass.clsMethod() + "\n" ); function upperClass() { this.instStr = "upper class instance property"; } upperClass.prototype = new baseClass; upper_inst = new upperClass(); alert( "upperClass:\n" + "\tinstStr = " + upper_inst.instStr + "\n" + "\tprtMethod = " + upper_inst.prtMethod() + "\n" + "\tclsStr = " + upperClass.clsStr + "\n" + "\tclsMethod = " + upperClass.clsMethod() + "\n" ); /* Exception: upperClass.clsMethod is not a function @Scratchpad:30 */ -------------------------------------------------------------ここまで 実行は Firefox 付属のスクラッチパッドで行いました。 期待する結果は、upperClass.clsStr がベースクラスで設定した"base class property"、upperClass.clsMethod() がその文字列を返す関数となって欲しいのです。 そもそも、Javascript ではクラス定義内部と prototype で設定したメンバとメソッドしか継承できないのでしょうか? あるいは他の方法がある?

  • javaのクラスに関する初歩的な質問

    今日は javaの初心者ですが、javaのプログラムのクラスについて、お教えください。 後記の、javaのクラスのコードについてお聞きします。 1)サブルーチンvoid aaa()は、問題なくコンパイルできまして、変数aにアクセスできます。 2)クラスpublic class xxx extends test{}の中で、変数aにアクセスできません。 Q1)項2に記しました、クラスpublic class xxx extends test{}の中で、変数a   にアクセスする方法はあります?。 Q2) クラスxxxxをnewで使用する方法はありますか?    注) this.xxxx=new xxx(); <---コンパイルエラーになる 初歩的な質問ですが、ご回答頂けますと大変たすかります。 //===================== package pkg; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; public class test extends JFrame { private JPanel contentPane; public int a=9; //Launch the application. public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { test frame = new test(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } //Create the frame. public test() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); aaa(); // this.xxxx=new xxx(); <---コンパイルエラーになる } public class xxx extends test{ // a=2; //コンパイルエラーになる。 } void aaa(){ System.out.println("a="+a); } }

    • ベストアンサー
    • Java
  • 【PHP】クラスを継承した際にデータ型も継承すると

    とある有料のオンライン学習サイトをつかっています。 学習項目の流れは以下の通りです。 現在「15 型の継承について見ていこう」で躓いています。 01 オブジェクトを使ってみよう (02:56) 02 投稿に関する処理を作ろう 03 クラスでデータ型を定義しよう 04 インスタンスを作ってみよう 05 コンストラクタを使ってみよう 06 クラスを整理しておこう 07 アクセス修飾子について見ていこう 08 メソッドを介してプロパティを操作しよう 09 プロパティで型宣言をしてみよう 10 staticキーワードを使ってみよう 11 オブジェクト定数を使ってみよう 12 クラスを継承してみよう 13 子クラスで独自の実装をしていこう 14 メソッドをoverrideしてみよう 15 型の継承について見ていこう *型の継承 *型を継承するメリット この項目で記述されているソースコードは下記のとおりです。コード内のクラス、SponsoredPostは クラスPostを継承しています。よって両方のクラスともにPost型として扱えると説明があります。 ソース内のこの箇所で processPostという関数を作成し、変数$postにPost型と型付けをしています そしてforeachでPostで型付けられた$post型(クラスPostとそれを継承したクラスSponsoredPost)をひとつづつ取り出し、processPostを用いてそれぞれにshow()メソッドで表示させています。 ----------------------- <?php class Post{ protected $text; public function __construct($text){ $this->text = $text; } public function show(){ printf('%s',$this->text); } class SponsoredPost extends Post{ private $sponsor; public function __construct($text, $sponsor){ parent::__construct($text); $this->sponsor = $sponsor; } public function show(){ printf('%s by %s', $this->text, $this->sponsor); } } $posts = []; $posts[0] = new Post('hello'); $posts[1] = new Post('hello again'); $posts[2] = new SponsoredPost('iPhone','Apple'); function processPost(Post $post){ $post->show(); } foreach($posts as $post){ processPost($post); ------------- クラスを継承すると親クラスのプロパティやメソッドが子クラスに継承されるというのは理解できています。「15 型の継承について見ていこう」という項目では 『Post型の変数を受け取る関数を作って、データ型が継承されることを説明していきます。』 と解説してあります。 クラスを継承すると親クラスのプロパティやメソッドが子クラスに継承されるというのは理解できています。私の知っているデータ型(文字列型、整数型、浮動小数点数型、論理型、配列型、オブジェクト型、リソース型、NULL)は下記の2か所だけです。 show()メソッド内の、['%s']と['%s by %s']で文字列が指定されています。 したがってこの項目で説明されている 『Post型の変数を受け取る関数を作って、データ型が継承されることを説明していきます。』 とは、「クラスを継承する際にプロパティやメソッドだけでなく、データ型、ここでは(['%s']と['%s by %s'])も継承されるということが説明されているという解釈でよろしいのでしょうか? 少し混乱しています。もし私の解釈が間違っているようでしたら教えてください。 初学者です。よろしくお願いいたします。 <表示結果>

    • ベストアンサー
    • PHP

専門家に質問してみよう