PHP子类Magic __isset有效,但__get没有

时间:2012-12-11 02:54:52

标签: php inheritance mongodb-php magic-methods

我有一个抽象的父类Mongo_Document(来自mongodb-php-odm)和一个继承的类Model_ActionPlanMongo_Document具有与Mongo_Document类中的数组交互的magic __isset和__get方法。

我正在尝试使用以下代码(来自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->status替换为parent::__get('status'),则此代码按预期工作。请注意,在程序的其他任何地方,我都可以使用:

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

只有这里,在课堂内部,这不起作用。

我环顾四周,似乎无法找到任何说明在子类中无法调用魔法的方法。我可以使用parent::__get调用,但我认为这可能是错误的方法。有谁知道是否有正确/更好的方法来做到这一点?

更新了#1 2012-12-16: 父类的完整代码是here on Github

更新了#2 2012-12-18: 对于询问设置在何处或是否设置正确的人,答案是,由于调用parent::__get('status') 确实有效,问题显然不是变量未设置。 __get()正在从名为_object的私有实例变量中获取其数据。如果我var_dump($this),我会看到$this->_object['status'] 等于预期的“已结算”值。

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


我见过this similar question但是那个是关于使用父的魔法来获取孩子的属性而我的问题是使用父的getter来获取父母的属性。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:-3)

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

$this->_object['status'] 

而不是

$this->status