Cam*_*Cam 38 php oop methods static abstract
我已经设置了一个抽象的父类,以及一个扩展它的具体类.为什么父类不能调用抽象函数?
//foo.php
<?php
abstract class AbstractFoo{
abstract public static function foo();
public static function getFoo(){
return self::foo();//line 5
}
}
class ConcreteFoo extends AbstractFoo{
public static function foo(){
return "bar";
}
}
echo ConcreteFoo::getFoo();
?>
Run Code Online (Sandbox Code Playgroud)
错误:
致命错误:无法 在第5行的foo.php中调用抽象方法AbstractFoo :: foo()
Art*_*cto 64
这是一个正确的实施; 你应该使用static而不是self,以便使用后期静态绑定:
abstract class AbstractFoo{
public static function foo() {
throw new RuntimeException("Unimplemented");
}
public static function getFoo(){
return static::foo();
}
}
class ConcreteFoo extends AbstractFoo{
public static function foo(){
return "bar";
}
}
echo ConcreteFoo::getFoo();
Run Code Online (Sandbox Code Playgroud)
给出了预期的"酒吧".
请注意,这不是真正的多态性.静态键工作只是解析为调用静态方法的类.如果声明一个抽象静态方法,您将收到严格警告.PHP只是复制父(超)类中的所有静态方法,如果它们不存在于子(子)类中.
你注意到这个词self
?
那是指向AbstractClass.因此它调用AbstractClass :: foo(),而不是ConcreteClass :: foo();
我相信PHP 5.3将提供后期静态绑定,但如果您不在该版本上,则self不会引用扩展类,而是引用该函数所在的类.
请参阅:http://us.php.net/manual/en/function.get-called-class.php