从非静态方法触发__callStatic()的怪异行为

Par*_*hal 5 php

我发现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()。那好吧。

感谢您的回答/评论。

Mat*_*hew 4

您可能会对类方法上下文中这些内容的含义感到困惑:

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()