【发布时间】:2012-02-27 17:24:44
【问题描述】:
我在 PHP 类 (v5.3.8) 中发现了这种奇怪的行为。
你有:
class foo {
function __call($func, $args) {
if ($func == 'bar')
echo "non-static __call";
}
static function __callStatic($func, $args) {
if ($func == 'bar')
echo "__callStatic";
}
function callMe() {
self::bar();
}
}
然后你做:
foo::bar() // outputs '__callStatic' as expected.
$f = new foo;
$f->callMe(); // outputs 'non-static __call', as I did not expect.
您会看到,从非静态函数调用的不存在的静态方法会触发 __call() 而不是 __callStatic()。我想知道这是否应该像这样工作还是这是某种错误?
[编辑]
我忘了在callMe() 上尝试static::bar(); 但不,它也没有用。
我(想我)理解 inhan 的评论,但仍然......如果我调用的是类本身,而不是实例或对象,我的直接逻辑说它应该触发 __callStatic()。哦,好吧。
感谢您的回答/cmets。
【问题讨论】:
-
PHP 有一大堆这些奇怪的行为... :/ 手册说“在静态 context 中调用不可访问的方法时会触发 __callStatic”,这表明这可能是预期的行为。但这当然没有多大意义。这完全违反直觉
-
callMe是一个非静态函数(在对象范围内),所以即使你调用了一个不存在的方法,你仍然在处理对象实例本身,所以很自然地会执行__call。 -
这很奇怪。如果您将
self::bar();更改为foo::bar(),它仍将被非静态调用,即使这显然是一个静态调用。 -
@webbiedave,
foo::bar()显然不是静态调用。在类中调用像这样的非静态方法来准确指定在继承的情况下调用哪个方法是完全有效的。 -
@Matthew:你当然是对的。我的猫又敲键盘了。
标签: php