1

我有一个类,我正在尝试创建一个函数,该函数将调用通过魔术方法运行的静态方法。问题是函数只要它们来自与调用它们的类不同类型的类,它们就可以工作,但是如果我调用同一类的静态函数,所有函数将返回 1。

class Test {
    public function static __callStatic($name, $params) {
        return 2;
    }
    public function __call($name, $params) {
        return 1;
    }
    public function Test1() {
        return Test::GetTwo(); 
    }
}
class Test2 {
   public function Test() {
       return Test::GetTwo();
   }
}
$t = new Test();
echo $t->Test1(); //prints 1 should be 2
$t2 = new Test2();
echo $t->Test(); //prints 2 as it should

即使静态方法 GetTwo() 返回一个对象,如果我在与 Test1() 相同的范围内调用一个函数,我仍然会得到 1。还有其他人遇到这个吗?

4

1 回答 1

1
echo Test::Test1();

您不需要(也不应该使用)实例来调用静态方法。使用类和范围解析运算符 (::) 进行调用。

如果您需要后期静态绑定,请使用static::Test1();

对于实例上的方法调用,PHP 将尝试以下操作:

  1. 找到一个名为 X 的实例方法。
  2. 找到一个神奇的方法__call。
  3. 找到一个名为 X 的类(静态)方法。
  4. 找到一个魔术类(静态)方法__callStatic。

在您的情况下,它会在第 2 步找到 __call 并继续。

于 2013-06-01T02:01:53.913 回答