2009-06-12 7 views
0

私が何をしたいのですが私は仕事に以下を取得しようとしているが、私は途方に暮れてよ...PHP5クラス:作成されたクラスを継承していますか?

class Foo { 
    public $somethingelse; 

    function __construct() { 
     echo 'I am Foo'; 
    } 
    function composition() { 
     $this->somethingelse =& new SomethingElse(); 
    } 
}
class Bar extends Foo { 
    function __construct() { 
     echo 'I am Bar, my parent is Foo'; 
    } 
}
class SomethingElse { 
    function __construct() { 
     echo 'I am some other class'; 
    } 
    function test() { 
     echo 'I am a method in the SomethingElse class'; 
    } 
}

はSomethingElseのインスタンスを作成することですクラスFoo内のクラス。これは=&を使用して動作します。しかし、クラスFooをクラスBarで拡張すると、子クラスは親クラスからすべてのデータ属性とメソッドを継承すると考えました。しかし、それは$this->somethingelseは、子クラスのバーでは動作しないようです:

$foo = new Foo(); // I am Foo 
$foo->composition(); // I am some other class 
$foo->somethingelse->test(); // I am a method in the SomethingElse class 

$bar = new Bar(); // I am Bar, my parent is Foo 
$bar->somethingelse->test(); // Fatal error: Call to a member function test() on a non-object

だから、このように継承することができないのですか?クラスバーの中からSomethingElseクラスの新しいインスタンスを作成する必要がありますか?または私は何かを逃していますか?

ご協力いただきありがとうございます。

+1

あなたはsomethingelseセットを持ってFooクラス、あなたが作成したクラスはFooのないインスタンスを、継承されています。 – cloudhead

+0

SomethingElseをシングルトンにすると、コンストラクタの代わりにSomethingElse :: getInstance()を使用します。そうでなければ、SomethingElseインスタンスが異なる任意の2つのインスタンス間で使用します。 –

答えて

5

をベースにして、あなたは、あなたの変数静的を行う必要があり、私は子供が親クラスからすべてのデータの属性とメソッドを継承することを考えました。

これは本当です - 子クラスは親クラスから静的変数と静的メソッドを継承します。さらに、すべての子オブジェクトは静的およびインスタンス変数とメソッドを継承します。あなたは、既存のクラス構造で欲しいものを得るために

一つの可能​​性はこれです:子インスタンス変数(この場合はオブジェクトを)継承達成する

$bar = new Bar(); 
$bar->composition();// here you are calling the parent method, sets instance var $somethineelse 
$bar->somethingelse->test();// now you can call methods 

もう一つの方法は、そのようなものだ:

PHP 5におけるクラスとオブジェクトの非常に良い概要については
class Foo { 
    protected $somethingelse; 
    public function __construct() { 
     $this->somethingelse = new SomethingElse(); 
    } 
} 

class Bar extends Foo { 
    public function __construct() { 
     parent::__construct(); 
     // now i've got $somethingelse 
    } 
} 

は、ここを見て:OOはあなたのための新規の場合 http://php.net/manual/en/language.oop5.php はそれをすべてをお読みください、多分数回を行います。

1

barには、fooから継承されたsomethingelseというメンバー変数があります。

オブジェクトとクラスのスコープが混在しています。

あなたが本当に説明した効果を達成する必要がある場合は、そのコンテキストは、クラス

0

まず、静的変数とインスタンス変数を区別する必要があります。静的変数はクラスのすべてのインスタンスで共有され、インスタンス変数は共有されません。あなたは正確に同じSomethingElseインスタンスを持つようにfooとbarのすべてのインスタンスをしたい場合は

あなたは$ somethingelse静的行う必要があります。

のpublic static $ somethingelse

、あなたは物の組成、機能を変更する必要がありますフー:

function composition() { 
    self::$somethingelse = new SomethingElse(); 
} 

あなたが次の操作を行うことができます。この静的フィールドにアクセスするには: $ FOO =新しいはFoo()を。 //私はFooです $ foo-> composition(); //私は他のクラスです Foo:$ somethingelse-> test(); //私はSomethingElseクラス

$バー=新しいバー()でメソッドです。 //私はBarです、私の親はFooです Bar :: $ somethingelse-> test(); //)(あなたはfooとbarのすべてのインスタンスは、あなたのコードを使用することができ、自分のSomethingElseインスタンスを持っている場合、私はSomethingElseクラス

における方法ですが、あなたは

$バー - >構図を追加する必要があります$バー - > somethingelse-前

>テスト();

$ bar = new Bar();

あなたはバーの完全に新しいインスタンスを作成し、そのインスタンスは、$ somethingelseプロパティを持っていますが、それはまだ設定されていません。ですから、それを設定するにはcomposition()を呼び出す必要があります。

すべてのfooとbarがまったく同じSomethingElseインスタンスを持つべきである場合、それはメモリが必要に減少するので、あなたは、代わりに静的なバージョンを使用する必要があります。

こちらがお役に立てば幸いです。そうでなければ、私はそれをさらに説明することが非常にうれしいです。

0

クラスが属性を共有しているとは、オブジェクトがの値を共有しているとは限りません。

他の人が指摘したように、あなたはインスタンスとクラスを混乱されています。

注、あなたがやった場合は、同じエラーを取得したい:以下抽象クラスの

$foo = new Foo(); // I am Foo 
$foo->composition(); // I am some other class 
$foo->somethingelse->test(); // I am a method in the SomethingElse class 

$foo2 = new Foo(); // I another Foo 
$foo2->somethingelse->test(); // Fatal error: Call to a member function test() on a non-object 

と思います。たとえば、 "Royalty"の親クラスである "Person"クラスがあるとします。

次に、あなたがやった場合:

が私を$ =新しい人(); $ ME-> firstNameの= "トーマス" =新しいロイヤリティ

$ princeCharles();

$ princeCharlesに "Thomas"と等しいfirstName属性を設定し、$ princeCharles-> firstNameを設定する場合は、$のfirstName属性の値を変更しない私。

$ meと$ princeCharlesの両方に属性 'firstName'がありますが、その属性のの値は共有されません。

0

派生クラスのコンストラクタで親クラスのコンストラクタを呼び出すと、問題は解決すると思います。これはPHPではデフォルトでは発生しませんので、継承するデータメンバーに問題がある場合は注意してください。

クラスバーはFooを拡張します。 public function __construct(){ parent :: __ construct();

} 

}

関連する問題