Pourquoi ne pouvez-vous pas appel abrégé des fonctions de classes abstraites en PHP?
J'ai mis en place un résumé parent de la classe, et une classe concrète qui l'étend. Pourquoi la classe parent de ne pas appeler la fonction abstraite?
//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();
?>
Erreur:
Erreur fatale: Impossible d'appeler la méthode abstraite AbstractFoo::foo() dans foo.php sur la ligne 5
- LOL... statique abstrait... :D: cool question
Vous devez vous connecter pour publier un commentaire.
C'est une mise en œuvre correcte; vous devez utiliser statique, pas de soi, afin d'utiliser late static bindings:
exprime le "bar".
Noter que ce n'est pas vraiment le polymorphisme. La statique clétage est tout résolu dans la classe à partir de laquelle la méthode statique a été appelé. Si vous déclarez un résumé, la méthode statique, vous recevrez un avertissement strict. PHP juste des copies de toutes les méthodes statiques de la société mère (super) classe si elles n'existent pas chez l'enfant (sous -) classe.
static
mot suivant pourfunction
de l'enfant et les classes abstraites.return static::foo();
whas la bonne réponse. Alors la super-classe peut se lier à la classe enfant de mise en œuvre de la fonction abstraite. La version de PHP 5.6.Vous remarquez que le mot
self
?Qui pointe vers AbstractClass. Ainsi, il appelle AbstractClass::foo(), pas ConcreteClass::foo();
Je crois que PHP 5.3 fournira résolution statique à la volée, mais si vous n'êtes pas sur cette version, l'auto ne fera pas référence à une classe étendue, mais la classe que la fonction est situé dans.
Voir: http://us.php.net/manual/en/function.get-called-class.php
self
à utiliser eststatic
de référenceConcreteClass
en 5.3+C'est une règle qui
abstract
etstatic
mots-clés ne peuvent pas être utiliser sur une méthode en même temps.Une méthode avec un
abstract
mot-clé signifie que sous-classe doit mettre en œuvre. L'ajout de l'électricité statique à une méthode d'une classe nous permet d'utiliser la méthode sans instanciation.C'est pourquoi l'erreur se produit.