魔术静态函数存在问题


Having Issues with Magic Static Functions

我有一个类,我正在尝试创建一个函数,该函数将调用通过魔术方法运行的静态方法。问题是,只要函数来自不同类型的类而不是调用它们的类,函数就可以工作,但是如果我调用同一类的静态函数,所有函数都会返回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。还有人碰到这个吗?

echo Test::Test1();

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

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

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

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

在你的例子中,它在第2步找到__call并继续