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

2022-08-30 10:25:16

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

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

错误:

致命错误:无法调用抽象方法 AbstractFoo::foo() 在第 5 行.php foo


答案 1

这是一个正确的实现;你应该使用静态的,而不是自我的,以便使用后期的静态绑定

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

给出预期的“柱”。

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


答案 2

你注意到这个词了吗?self

这指向了 AbstractClass。因此,它调用 AbstractClass::foo(),而不是 ConcreteClass::foo();

我相信PHP 5.3会提供后期的静态绑定,但是如果你不在那个版本上,self不会引用扩展类,而是函数所在的类。

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


推荐