trait poo interfaces herencia ejemplos clases abstractas php oop static methods abstract

poo - ¿Por qué no puedes llamar funciones abstractas de clases abstractas en PHP?



php herencia (3)

He creado una clase primaria abstracta y una clase concreta que la amplía. ¿Por qué la clase padre no llama a la función abstracta?

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

Error:

Error fatal: no se puede llamar al método abstracto AbstractFoo :: foo () en foo.php en la línea 5


¿Notaste esa palabra self ?

Eso está apuntando a AbstractClass. Por lo tanto, está llamando a AbstractClass :: foo (), no a ConcreteClass :: foo ();

Creo que PHP 5.3 proporcionará enlaces estáticos tardíos, pero si no está en esa versión, self no se referirá a una clase extendida, sino a la clase en la que se encuentra la función.

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


Es una regla que las palabras clave abstract y static no se pueden usar en un método al mismo tiempo.

Un método con una palabra clave abstract significa que la subclase debe implementarlo. Agregar static a un método de una clase nos permite usar el método sin instanciarlo.

Entonces esa es la razón por la cual ocurre el error.


Esta es una implementación correcta; debe usar static, no self, para usar enlaces estáticos tardíos :

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

da la "barra" esperada.

Tenga en cuenta que esto no es realmente polimorfismo. La clave estática simplemente se resuelve en la clase a partir de la cual se llamó el método estático. Si declara un método estático abstracto, recibirá una advertencia estricta. PHP simplemente copia todos los métodos estáticos de la clase principal (super) si no existen en la clase secundaria (secundaria).