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

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只是复制父(超)类中的所有静态方法,如果它们不存在于子(子)类中.

  • 生病...谢谢!自我和静态有什么区别?编辑:显然该关键字不存在(可能是版本的东西). (2认同)
  • 阅读我链接的后期静态绑定的手册页. (2认同)

Tyl*_*ter 7

你注意到这个词self

那是指向AbstractClass.因此它调用AbstractClass :: foo(),而不是ConcreteClass :: foo();

我相信PHP 5.3将提供后期静态绑定,但如果您不在该版本上,则self不会引用扩展类,而是引用该函数所在的类.

请参阅:http://us.php.net/manual/en/function.get-called-class.php