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

时间:2012-02-27 17:24:44

标签: 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();
  }
}

然后你做:

foo::bar() // outputs '__callStatic' as expected.
$f = new foo;
$f->callMe(); // outputs 'non-static __call', as I did not expect.

您可以看到,从非静态函数调用的不存在的静态方法会触发__call()而不是__callStatic()。我想知道这是否应该像这样工作或者这是某种错误?

[编辑]

我忘记在static::bar();上尝试callMe(),但不,它也没有用。

我(我想)理解inhan的评论但仍然......如果我正在调用类本身,而不是实例或对象,我的直接逻辑说它应该触发__callStatic()。哦,好吧。

感谢您的回答/评论。

2 个答案:

答案 0 :(得分:4)

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

class B extends A {
  public function test() {
    A::foo();
    self::foo();
    static::foo();
  }
}

没有那些意味着"调用名为foo的静态方法。"它只是意味着"调用名为foo&#34的方法;在继承树中由冒号左边指定的位置。

通常,没有魔法,你只有一个名为foo的函数,所以意思很简单。但是,当您使用两个魔术方法重载时,调用不明确。 PHP默认使用__call()之前的__callStatic()

答案 1 :(得分:1)

静态方法,变量属于不属于对象的类,所以我认为这应该是这样的。