PHP:从父类调用静态方法时出现“未定义的方法调用”错误

5

如果父类和子类均为静态方式,正确的调用子类方法的方法是什么?

当我使用静态类时,它会返回错误“Call to undefined method A::multi()”,但是当我使用非静态方法时就没有问题,例如:

//-------------- 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

有没有一种方式可以调用子静态方法,而不需要知道它的类名?

我找到了一个原因:正如在错误#30934中所指出的(实际上不是一个错误,而是设计决策的结果),"self"关键字在编译时绑定。除其他外,这意味着在基类方法中,无论方法被调用的实际(派生)类是什么,任何对"self"关键字的使用都将引用该基类。(来源:http://www.php.net/manual/en/function.get-class.php#77698)然而,我仍然需要一个解决方案... - lepe
仅供记录,这个问题在PHP 5.3中已经解决(正如BoltClock所建议的那样),使用以下代码:return static::multi($a, $b);而不是在父类中使用"self"。 - lepe
1个回答

5

只有在PHP 5.3及更高版本中才能使用后期静态绑定,因为PHP 5.3可以访问子类中的静态成员,而不是self所指的类,因为它是在运行时而不是编译时解析的。

不幸的是,我认为在PHP 5.2和更早的版本中没有解决方案。


是的,这就是我所读到的...不管怎么样,还是谢谢你!(我应该更新PHP...) - lepe
-1 静态成员没有继承性。如果静态方法在子类中没有被重新定义,那么子类中会有一个静态方法的副本,但这并不是继承。 - Artefacto
@Artefacto:我明白了,我的错。我已经相应地更正了我的答案。 - BoltClock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接