25

我有一个抽象父类Mongo_Document(来自mongodb-php-odm)和一个继承类Model_ActionPlanMongo_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调用,但我认为这可能是错误的方法。有谁知道是否有正确/更好的方法来做到这一点?

2012-12-16 更新 #1: 父类的完整代码在 Github 上

2012 年 12 月 18 日更新 #2: 对于那些询问在哪里或是否设置正确的人,答案是由于调用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,它显示了当 getter 触发对自身的调用时记录的完全相同类型的错误。在这种情况下,它很容易被发现,但是对于像 func() 到 __get() 到 funcB() 到 funcC() 到 __get() 这样的更复杂的调用图,就不容易发现了。

于 2012-12-24T01:20:22.243 回答
-3

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

$this->_object['status'] 

代替

$this->status
于 2012-12-19T17:57:55.403 回答