vais-je obtenir les mêmes résultats?
Pas vraiment. Je ne connais pas de solution de contournement pour PHP 5.2, cependant.
Quelle est la difference entre new self
et new static
?
self
fait référence à la même classe dans laquelle le new
mot clé est réellement écrit.
static
, dans les dernières liaisons statiques de PHP 5.3, fait référence à la classe de la hiérarchie sur laquelle vous avez appelé la méthode.
Dans l'exemple suivant, B
hérite des deux méthodes de A
. L' self
invocation est liée à A
car elle est définie dans A
l'implémentation de la première méthode, tandis qu'elle static
est liée à la classe appelée (voir aussi get_called_class()
).
class A {
public static function get_self() {
return new self();
}
public static function get_static() {
return new static();
}
}
class B extends A {}
echo get_class(B::get_self()); // A
echo get_class(B::get_static()); // B
echo get_class(A::get_self()); // A
echo get_class(A::get_static()); // A
get_called_class()
, ce qui est en fait le même que__CLASS__
, mais compatible LSB.self
serait lui - même revenir, etstatic
retourne quelque chose qui ne peut pas être surchargée ... Mais voilà que c'est le contraire. Je ne cesse d'être impressionné par la dénomination, les conventions et le style général de PHP. -_-Si la méthode de ce code n'est pas statique, vous pouvez obtenir une solution de contournement en 5.2 en utilisant
get_class($this)
.Les resultats:
la source
clone
, mais simplement en recréant et en définissant les propriétés.$copy = new static(); $copy->set($this->get()); return $copy;
self::
oustatic::
va affecter si la version de la classe de base ou de la sous-classe de cette méthode statique est utilisée. En l’absence de toute raison de penser qu’une telle situation se produise par nature comme une mauvaise pratique (et je ne vois aucune raison pour laquelle il devrait en être ainsi), le choix entreself::
etstatic::
est tout aussi pertinent dans les méthodes non statiques que dans méthodes statiques. Ai-je mal compris votre commentaire, ou est-ce que nous nous trompons tout simplement?En plus des réponses des autres:
Cela signifie que vous ne pouvez pas utiliser
static::
dans une propriété de classe car les valeurs des propriétés:En utilisant
self::
la source
public $name = static::class;
, pas sur la ligne 7, comme le suggère l'exemple. L'erreur indique: "static :: class ne peut pas être utilisé pour la résolution de nom de classe au moment de la compilation", ce qui indique que le problème n'est pas là où vous essayez d'accéder au champ $ name, mais bien avant, lors de la compilation de la classe PHP. La ligne 7 (ou 6) ne sera pas atteinte dans le premier exemple.