2011-07-30 9 views
1

親クラスからプロパティにアクセスできる理由は理解できませんが、親によって既に設定されていてもNULLです。故意にリセットされていない)。そのプロパティは私的な方法で設定されているためかもしれないと思ったが、私がpublicに変更したときに違いはなかった。ここでは根本的に簡略化した例です:子メソッドからアクセスすると親メソッドによって親クラスのプロパティが空白に設定される

​​

私は子供がnew TheChild($this->_parent_property)すなわち親によって構築されたときに子供に、親プロパティを渡すことで、この問題を回避働いていたが、なぜ$この私はまだ理解していない - > _ parent_propertyです元の例の子からアクセスするとNULLに設定されます。

親コンストラクタからこのプロパティを設定した場合、私はそれをうまく利用することができます。私は親メソッドによって設定され、他の親メソッドからアクセス可能なプロパティが、親を拡張する子クラスからアクセスできない理由を理解しようとしています。

誰でも説明できますか?ありがとう!

答えて

2

問題は、変数が設定されていない新しいインスタンスを作成していることです。このプロパティは特定のインスタンスにバインドされているので、親のインスタンスを1つ作成してから、親の別のインスタンスを作成します。これには、新しい親を作成するすべてのものが含まれます($_parent_propertyなど)。子の値を読むと、以前に作成したものではなく、新しく作成した親の値が読み込まれます。

効果で、あなたがこれを行う:

A = new TheParent() 
A->_parent_property = 'test' 
Calls: 
    B = new TheChild(), underneath the covers, this does new TheParent() 
    Print B->_parent_property (which was uninitialized) 

があなたの期待された結果生成されます。この同様の例考えてみます。この例では

class TheParent 
{ 

    protected $_parent_property; 

    function __construct() 
    { 
     parent_method(); 
    } 

    private function parent_method(); 
    { 
     $this->_parent_property = 'test'; 
    } 
} 

class TheChild extends TheParent 
{ 
    function __construct() 
    { 
     parent::construct(); 
    } 

    public function child_method(); 
    { 
     echo $this->_parent_property; 
     exit; 
    } 
} 

$child = new TheChild(); 
$child->child_method(); 

を、TheParentでプライベートメソッドは同じで呼び出されますインスタンスTheChildによって作成され、基礎となるインスタンス変数を設定します。

+0

返信いただきありがとうございます。親メソッドが呼び出されたときに親プロパティの値を渡していることを示すために私のサンプルを更新しました。あなたの答えに基づいて、最初にそれを子クラスに渡すことなくプロパティの元のparam値を保持することは不可能であると思いますか? –

+1

@Calvin:あなたの関係は後ろにあり、 'TheChild'は' TheParent'から継承します。 'TheChild'を' TheParent'に拡張する場合は、セッターメソッドを 'TheChild'に公開するか、継承関係を削除し、 'TheParent'を' TheChild'(または必要な変数)に置き換えます –

+0

これは静的変数と呼ばれています。なぜTheParentはTheChildをインスタンス化するのですか? –

1

継承がどのように機能するかについては、やや間違っています。

TheParentはクラスであり、TheChildTheParentに基づくクラスである。 $testは今やTheParentのインスタンスです。クラスTheParentに基づく別のクラスTheChildがあることは考えられません。

TheChildの新しいインスタンス$callを作成します。これは、別の単語を使用するために、新しいオブジェクトです。両方ともTheParentと「互換性がある」ことを除いて、$testとは関係ありません。

TheChild$call)は、その親(クラス)からプロパティ_parent_propertyを継承します。ただし、そのプロパティはそのインスタンス(オブジェクト)で初期化/設定されていないので、まだNULLです。

+0

はい、マークの答えはそれを明確にするのに役立ちました。とにかく、読んで返信する時間を取ってくれたので、私はあなたをあきらめました。ありがとう=) –

関連する問題