25

Mongo_Document( mongodb-php-odmからの) 抽象親クラスと継承されたクラスがありModel_ActionPlanます。 クラスMongo_Document内の配列とやり取りする魔法の __isset および __get メソッドがあります。Mongo_Document

次のコードを使用しようとしています (のメソッド内のスニペットModel_ActionPlan):

if (isset($this->status))
{
    if (($this->status === "closed") AND ($this->close_type != "failure"))
    {
        return;
    }
}

close_type(が設定されていることが保証されていることに注意してくださいstatus == 'closed'。)

isset呼び出しが返され、true実行は次のステートメントに進みます。そこで、次のエラーが表示されます。

 Undefined property: Model_ActionPlan::$status

ただし、 に置き換える$this->statusparent::__get('status')、このコードは期待どおりに機能します。プログラムの他の場所では、次を使用できることに注意してください。

$ap = new Model_ActionPlan($plan_id);
echo $ap->status;
// Prints 'closed' (or 'active') as expected

これが機能しないのは、クラス自体の内部だけです。

私は周りを見回しましたが、子クラスで魔法のメソッドを呼び出すことができないと言っている場所を見つけることができないようです。代わりに呼び出しを使用できますが、parent::__getそれはおそらく間違った方法だと思います。これを行う正しい/より良い方法があるかどうか誰かが知っていますか?

更新 #1 2012-12-16: 親クラスの完全なコードはGithub にあります。

更新 #2 2012-12-18: どこで、または適切に設定されているかどうかについて尋ねた人々の答えは、呼び出しparent::__get('status') 機能するため、問題は変数が設定されていないことではないということです。は、 という名前__get()のプライベート インスタンス変数からデータを取得しています_object。I の場合、期待される「クローズ」値に等しいことvar_dump($this)わかります。$this->_object['status']

更新 #3: 子クラスのコードはhttps://gist.github.com/4332062で入手できます。重要な部分は 69 行目からです。


この同様の質問を見たことがありますが、それは親の魔法のメソッドを使用して子のプロパティを取得することに関するものであり、私の問題は親のゲッターを使用して親のプロパティを取得することです。

4

2 に答える 2

3

親の __get 関数はやや複雑なので、次のことが起こっているかどうかは完全にはわかりません。一度呼び出された __get 関数が何らかの方法で別の呼び出しをそれ自体にトリガーしている場合 (おそらく、スタック上の他の関数への呼び出しが介在している可能性があります)、これはまさに起こることです。

http://php.net/manual/en/language.oop5.overloading.php#55486を参照してください。これは、ゲッターがそれ自体への呼び出しをトリガーしたときにログに記録されるのとまったく同じタイプのエラーを示しています。その場合、見つけるのはかなり簡単ですが、func() から __get() から funcB() から funcC() から __get() のような複雑な呼び出しグラフでは、見つけるのは簡単ではありません。

于 2012-12-24T01:20:22.243 に答える
-3

私が正しいかどうかはわかりませんが、使用しないでください

$this->_object['status'] 

それ以外の

$this->status
于 2012-12-19T17:57:55.403 に答える