Que sont exactement les liaisons statiques tardives en PHP?
la source
Que sont exactement les liaisons statiques tardives en PHP?
Vous devez absolument lire les liaisons statiques tardives dans le manuel PHP. Cependant, je vais essayer de vous donner un bref résumé.
En gros, cela se résume au fait que le self
mot-clé ne suit pas les mêmes règles d'héritage. self
résout toujours la classe dans laquelle il est utilisé. Cela signifie que si vous créez une méthode dans une classe parent et que vous l'appelez à partir d'une classe enfant, vous self
ne référencerez pas l'enfant comme vous vous en doutez.
La liaison statique tardive introduit une nouvelle utilisation du static
mot - clé, qui résout cette lacune particulière. Lorsque vous utilisez static
, il représente la classe où vous l'utilisez pour la première fois, c'est-à-dire. il «se lie» à la classe d'exécution.
Ce sont les deux concepts de base derrière cela. La façon self
, parent
et static
fonctionne quand static
est en jeu peut être subtile, alors plutôt que d' aller pour plus de détails, je vous recommande fortement que vous étudiez les exemples de pages de manuel. Une fois que vous avez compris les bases de chaque mot-clé, les exemples sont tout à fait nécessaires pour voir le type de résultats que vous allez obtenir.
self
mot-clé ne suit pas les règles d'héritage.self
résout toujours la classe dans laquelle il est utilisé." - Ce qui ne signifie pas que vous ne pouvez pas appeler la méthode statique d'un parent à partir d'un objet enfant viaself
, comme avec les méthodes non statiques. Vous pensez peut-être la bonne chose, mais vous devriez reformuler cela. Tout cela n'a vraiment d'importance qu'une fois que les enfants ont des membres nommés de manière identique, car vous pouvez ensuite décider à ceux auxquels vous référer en utilisant à lastatic::
place.Depuis PHP: liaisons statiques tardives - Manuel :
Voyons un exemple:
la source
Il n'y a pas de comportement très évident:
Le code suivant produit «alphabeta».
Cependant, si nous supprimons la déclaration de la fonction classname de la classe beta, nous obtenons 'alphaalpha' comme résultat.
la source
Je cite le livre: "PHP Master écrit du code de pointe".
N'hésitez pas à consulter également la documentation officielle de php: http://php.net/manual/en/language.oop5.late-static-bindings.php
La manière la plus claire d'expliquer la liaison statique tardive est d'utiliser un exemple simple. Jetez un œil aux deux définitions de classe ci-dessous et poursuivez votre lecture.
Nous voyons une classe parent (véhicule) et une classe enfant (voiture). La classe parent a 2 méthodes publiques:
invokeDriveByStatic
invokeStopBySelf
La classe parent dispose également de 2 méthodes privées:
drive
stop
La classe enfant remplace 2 méthodes:
drive
stop
Appelons maintenant les méthodes publiques:
invokeDriveByStatic
invokeStopBySelf
Demandez-vous: quelle classe invoque
invokeDriveByStatic
/invokeStopBySelf
? La classe Parent ou Enfant?Jetez un œil ci-dessous:
Le
static
mot-clé est utilisé dans un modèle de conception Singleton. Voir le lien: https://refactoring.guru/design-patterns/singleton/php/examplela source
L'exemple le plus simple pour montrer la différence.
Remarque, soi - même :: $ c
Liaison statique tardive, notez static :: $ c
la source
Par exemple:
la source
En le regardant à partir d'un "pourquoi est-ce que j'utiliserais ceci?" perspective, c'est essentiellement un moyen de changer le contexte à partir duquel la méthode statique est interprétée / exécutée.
Avec
self
, le contexte est celui dans lequel vous avez défini la méthode à l'origine. Avecstatic
, c'est celui d'où vous l'appelez.la source
Vérifiez également si vous mettez à jour des variables statiques dans les classes enfants. J'ai trouvé ce résultat (quelque peu) inattendu où l'enfant B met à jour l'enfant C:
Vous pouvez le corriger en déclarant la même variable dans chaque classe enfant, par exemple:
la source