代码之家  ›  专栏  ›  技术社区  ›  Cam

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

  •  35
  • Cam  · 技术社区  · 15 年前

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

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

    错误:

    致命错误:无法在中调用抽象方法abstract foo::foo()。 PHP 在线5

    3 回复  |  直到 12 年前
        1
  •  61
  •   Artefacto    15 年前

    这是一个正确的实现;为了使用 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只复制父(超级)类中的所有静态方法。

        2
  •  7
  •   Tyler Carter    15 年前

    你注意到那个词了吗? self ?

    这是指向AbstractClass的。因此,它调用的是abstractClass::foo(),而不是concreteClass::foo();

    我相信PHP5.3将提供最新的静态绑定,但是如果您不在这个版本上,self将不会引用扩展类,而是引用函数所在的类。

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

        3
  •  0
  •   Mike G    13 年前

    这是一条规则 abstract static 关键字不能同时用于方法。

    具有 摘要 关键字意味着子类必须实现它。向类的方法添加static允许我们使用该方法而不实例化它。

    所以这就是发生错误的原因。