如果两者都是静态的,从父类调用子类方法的正确方法如何?PHP:调用父类的静态方法时调用“未定义的方法”错误
当我使用静态类则返回错误“调用未定义的方法A ::多()”,但是当我使用非静态方法是没有问题的,例如:
//-------------- STATIC ------------------
class A {
public static function calc($a,$b) {
return self::multi($a, $b);
}
}
class B extends A {
public static function multi($a, $b) {
return $a*$b;
}
}
echo B::calc(3,4); //ERROR!!
//-------------- NON-STATIC ----------------
class C {
public function calc($a,$b) {
return $this->multi($a, $b);
}
}
class D extends C {
public function multi($a, $b) {
return $a*$b;
}
}
$D = new D();
echo $D->calc(3,4); // Returns: 12
有没有办法在不知道类名的情况下调用子静态方法?
我发现一个原因: 正如bug#30934(这实际上不是一个错误,而是设计决定的结果)中指出的,“self”关键字在编译时绑定。除此之外,这意味着在基类方法中,任何对“self”关键字的使用都会引用该基类,而不管该方法被调用的实际(派生)类。 (在:http://www.php.net/manual/en/function.get-class.php#77698) 但是我仍然需要一个解决方案... – lepe 2010-06-24 04:13:30
只是为了记录在案,这是在PHP 5.3解决(如BoltClock建议)使用: 返回static :: multi($ a,$ b); 而不是在父类中使用“self”。 – lepe 2010-06-24 05:03:14