PHP 子类魔术__isset工作,但__get不起作用

我有一个抽象的父类(来自mongodb-php-odm)和一个继承类。 具有神奇__isset和__get方法,这些方法与类内的数组进行交互。Mongo_DocumentModel_ActionPlanMongo_DocumentMongo_Document

我正在尝试使用以下代码(来自方法内部的片段):Model_ActionPlan

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

(请注意,如果 .)close_typestatus == 'closed'

调用返回,然后执行继续进行下一个语句。在那里,我收到以下错误:issettrue

 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:对于那些询问它在哪里或是否正确设置的人来说,答案是,由于调用确实有效,问题显然不是变量没有被设置。正在从名为 的私有 instace 变量获取其数据。如果我,我看到它确实等于预期的“闭合”值。parent::__get('status')__get()_objectvar_dump($this)$this->_object['status']

更新#3:子类的代码可在 https://gist.github.com/4332062。重要部分从第69行开始。


我见过类似的问题,但这个问题是关于使用父级的魔术方法来获取子级的属性,而我的问题是使用父级的 getter 来获取父级的属性。


答案 1

父函数中的__get函数有些复杂,因此我还没有完全弄清楚是否可能发生以下情况。如果你__get函数一旦被调用,就会以某种方式触发另一个回调(也许会对堆栈上的其他函数进行一些干预调用),那么这正是将要发生的事情。

请参阅 http://php.net/manual/en/language.oop5.overloading.php#55486,它显示了当 getter 触发对自身的调用时所记录的完全相同类型的错误。在这种情况下,很容易发现,但是对于更复杂的调用图,如func()到__get()到funcB()到funcC()到__get(),就不容易发现了。


答案 2

不确定我是否正确,但你不应该使用

$this->_object['status'] 

而不是

$this->status

推荐