gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-28 23:44:17 27 4
gpt4 key购买 nike

我有一个抽象父类 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;
}
}

(请注意,如果 status == 'closed',则保证设置 close_type。)

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 调用,但我认为这可能是错误的方法。有谁知道是否有正确/更好的方法来做到这一点?

2012 年 12 月 16 日更新 #1:父类的完整代码为here on Github .

更新 #2 2012-12-18:对于询问在哪里或是否设置正确的人,答案是因为调用 parent::__get('status') does 工作,问题显然是并不是说变量没有被设置。 __get() 从名为 _object 的私有(private)实例变量中获取数据。如果我 var_dump($this),我看到 $this->_object['status'] does 等于预期的“关闭”值.

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


我看过this similar question但那个是关于使用 parent 的魔法方法来获取 child 的属性,而我的问题是使用 parent 的 setter/getter 来获取 parent 的属性。

最佳答案

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

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

关于PHP 子类 Magic __isset 有效,但 __get 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13812927/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com