gpt4 book ai didi

php - __call 捕获静态方法调用

转载 作者:可可西里 更新时间:2023-10-31 23:22:45 26 4
gpt4 key购买 nike

我正在使用这两种魔术方法 _call _callStatic用于我自己的 ORM/Activerow 之类的实现。它们主要用于捕获某些函数调用:__call 负责 getter 和 setter,而 __callStatic 用于 findBy 方法(例如 findById).

为了映射外键,我正在尝试将调用转换为例如getArticle 返回 Article::findById() 的值。为此,我在我的 __call 中使用了这个案例:

if (strstr($property, "_id")) {  
return $foreignClass::findById($this->getId());
}

其中$property__callsetget之后的子串,而$foreignClass 字符串的其余部分。因此,在调用 getArticle 的情况下,$property 将是 get 而 $foreignClass 将是 Article

我放置了一些 echo 以确保这些值是正确的。但是,我的 __call 方法被调用而不是我的 __callStatic。如果我创建一个隐式静态方法 findById,它确实会被调用(因此它确实将其识别为静态调用)。如果我专门调用 Article::findById()__call 也会捕获它。

这是相对较新的 __callStatic 的错误,还是我做错了什么?

编辑:问题似乎出在这部分:

_call() is triggered when invoking inaccessible methods in an object context.
__callStatic() is triggered when invoking inaccessible methods in a static context.

虽然我是在类上调用它,但我是从对象上下文中调用它。在这种情况下有没有办法进入静态上下文?

最佳答案

由于您提供的代码在 Activity 对象的上下文中运行,并且由于 $foreignClas 的值是 Article,这是一个Activity 的祖先,PHP 假定您打算 to call an ancestor's implementation的方法。

要突破对象上下文,据我所知,除了这种绝对可怕的技术之外别无选择:

$id = $this->getById();
return call_user_func(
function() use($foreignClass, $id) {
return call_user_func("$foreignClass::findById", $id);
}
);

关于php - __call 捕获静态方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13232445/

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