我发现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();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您执行以下操作:
foo::bar() // outputs '__callStatic' as expected.
$f = new foo;
$f->callMe(); // outputs 'non-static __call', as I did not expect.
Run Code Online (Sandbox Code Playgroud)
您会看到,从非静态函数调用的不存在的静态方法将触发__call()而不是__callStatic()。我想知道这是否应该像这样工作,还是某种错误?
[编辑]
我忘了尝试static::bar();,callMe()但是不行,它也不起作用。
我(认为我)理解了inhan的评论,但仍然...如果我是在调用类本身,而不是实例或对象,对我而言,立即逻辑说它将触发__callStatic()。那好吧。
感谢您的回答/评论。
您可能会对类方法上下文中这些内容的含义感到困惑:
class B extends A {
public function test() {
A::foo();
self::foo();
static::foo();
}
}
Run Code Online (Sandbox Code Playgroud)
这些都不意味着“调用名为 foo 的静态方法”。它只是意味着在继承树中由冒号左边指定的位置“调用名为 foo 的方法”。
通常,如果没有魔法,您只有一个名为 的函数foo,因此含义很简单。但是,当您重载这两个魔术方法时,调用是不明确的。PHP 默认使用__call()before __callStatic()。