Mos*_*atz 25 php inheritance magic-methods mongodb-php
我有一个抽象的父类Mongo_Document(来自mongodb-php-odm)和一个继承的类Model_ActionPlan. Mongo_Document具有与Mongo_Document类内部数组交互的magic __isset和__get方法.
我试图使用以下代码(从方法内部的代码片段Model_ActionPlan):
if (isset($this->status))
{
if (($this->status === "closed") AND ($this->close_type != "failure"))
{
return;
}
}
Run Code Online (Sandbox Code Playgroud)
(注意,close_type如果是,则保证设置status == 'closed'.)
该isset调用返回true,然后继续执行下一条语句.在那里,我收到以下错误:
Undefined property: Model_ActionPlan::$status
Run Code Online (Sandbox Code Playgroud)
但是,如果我替换$this->status为parent::__get('status'),则此代码按预期工作.请注意,在程序的其他任何地方,我都可以使用:
$ap = new Model_ActionPlan($plan_id);
echo $ap->status;
// Prints 'closed' (or 'active') as expected
Run Code Online (Sandbox Code Playgroud)
只有在这里,在课堂内部,这不起作用.
我环顾四周,似乎无法找到任何说明在子类中无法调用魔法的方法.我可以使用该parent::__get调用,但我认为这可能是错误的方法.有谁知道是否有正确/更好的方法来做到这一点?
更新了#1 2012-12-16: 父类的完整代码在Github上.
更新了#2 2012-12-18:
对于询问设置在何处或是否设置正确的人,答案是,由于调用parent::__get('status') 确实有效,问题显然不是变量没有设置.它__get()是从一个名为的私有instace变量中获取数据的_object.如果我var_dump($this),我看到它$this->_object['status'] 确实等于预期的"封闭"值.
更新#3: 子类的代码可在https://gist.github.com/4332062获得.重要的部分从第69行开始.
我已经看到了这个类似的问题,但是一个是关于使用父级的魔法来获取孩子的属性,而我的问题是使用父级的getter来获取父级的属性.
父级中的 __get 函数有些复杂,因此我还没有完全弄清楚是否会发生以下情况。如果您的 __get 函数一旦被调用,就会以某种方式触发另一个回调到自身(可能会对堆栈上的其他函数进行一些干预调用),这正是会发生的情况。
请参阅http://php.net/manual/en/language.oop5.overloading.php#55486,它显示了当 getter 触发对其自身的调用时记录的完全相同类型的错误。在这种情况下,很容易发现,但如果有更复杂的调用图,例如 func() 到 __get() 到 funcB() 到 funcC() 到 __get() ,就不容易发现了。