2010-06-24 85 views
4

如果两者都是静态的,从父类调用子类方法的正确方法如何?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 

有没有办法在不知道类名的情况下调用子静态方法?

+0

我发现一个原因: 正如bug#30934(这实际上不是一个错误,而是设计决定的结果)中指出的,“self”关键字在编译时绑定。除此之外,这意味着在基类方法中,任何对“self”关键字的使用都会引用该基类,而不管该方法被调用的实际(派生)类。 (在:http://www.php.net/manual/en/function.get-class.php#77698) 但是我仍然需要一个解决方案... – lepe 2010-06-24 04:13:30

+0

只是为了记录在案,这是在PHP 5.3解决(如BoltClock建议)使用: 返回static :: multi($ a,$ b); 而不是在父类中使用“self”。 – lepe 2010-06-24 05:03:14

回答

5

它只能在PHP 5.3和更新的版本中使用late static bindings,其中PHP 5.3能够访问子类中的静态成员,而不是任何self引用的类,因为它在运行时而不是编译时解析。

不幸的是,我不认为在PHP 5.2及更高版本中有这样的解决方案。

+0

是的,这是我读的......无论如何谢谢! (我应该更新PHP ...) – lepe 2010-06-24 04:19:34

+0

-1没有静态成员的继承。如果没有重新定义子类中的静态方法的副本,但它不是继承。 – Artefacto 2010-06-24 04:39:04

+0

@Artefacto:我明白了,我的不好。我已经相应地更正了我的答案。 – BoltClock 2010-06-24 04:41:51

相关问题