有魔术静态功能的问题

时间:2013-06-01 01:53:54

标签: php

我有一个类,我试图创建一个函数来调用一个通过魔术方法运行的静态方法。事情是函数工作,只要它们来自不同类型的类而不是调用它们的类,但是如果我调用同一个类的静态函数,则返回的所有函数都是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。还有其他人碰到这个吗?

1 个答案:

答案 0 :(得分:1)

echo Test::Test1();

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

如果您需要late static binding,请使用static::Test1();

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

  1. 查找名为X的实例方法。
  2. 找一个神奇的方法__call。
  3. 查找名为X的类(静态)方法。
  4. 找一个魔术类(静态)方法__callStatic。
  5. 在你的情况下,它会在第2步找到__call并继续使用。