为什么不能在PHP中从抽象类调用抽象函数?

我设置了一个抽象父类,和一个扩展它的具体类。为什么父类不能调用抽象函数?

//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();
?>

错误:

Fatal error: Cannot call abstract method AbstractFoo::foo() in foo.php on line 5

这是一个正确的实现;你应该使用静态,而不是自己,以便使用late static bindings

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();

给出预期的“bar”。

注意,这不是真正的多态性。静态密钥工作只是被解析成静态方法被调用的类。如果声明抽象静态方法,您将收到严格的警告。 PHP只复制父(super)类中的所有静态方法,如果它们不存在于子(子)类中。

http://stackoverflow.com/questions/2859633/why-cant-you-call-abstract-functions-from-abstract-classes-in-php

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:为什么不能在PHP中从抽象类调用抽象函数?