Quels sont exactement résolution statique à la volée en PHP?
Quels sont exactement résolution statique à la volée en PHP?
Vous devez vous connecter pour publier un commentaire.
Quels sont exactement résolution statique à la volée en PHP?
Vous devez vous connecter pour publier un commentaire.
Vous devez absolument lire Late Static Bindings dans le manuel PHP. Cependant, je vais essayer de vous donner un rapide résumé.
Fondamentalement, elle se résume au fait que le
self
mot-clé ne suivent pas les mêmes règles de l'héritage.self
résout toujours à la classe dans laquelle il est utilisé. Cela signifie que si vous avez une méthode dans une classe parent et l'appeler à partir d'un enfant de la classe,self
pas référence à l'enfant que vous pourriez vous attendre.Late static binding introduit une nouvelle utilisation pour le
static
mot-clé, qui traite de cette lacune. Lorsque vous utilisezstatic
, il représente la classe où la première utilisation, c'est à dire. il " lie " à la classe d'exécution.Ce sont les deux concepts de base derrière elle. La façon
self
,parent
etstatic
fonctionner quandstatic
est en jeu peuvent être subtiles, alors plutôt que d'aller dans pour plus de détails, je voudrais vous recommandons fortement d'étude à la page de manuel des exemples. Une fois que vous comprenez les bases de chaque mot-clé, les exemples sont tout à fait nécessaire pour voir quel genre de résultats que vous allez obtenir.self
mot clé n'a pas suivi les règles de l'héritage.self
résout toujours à la classe dans laquelle il est utilisé." - Ce qui ne signifie pas que vous ne pouvez pas appeler un parent méthode statique à partir d'un enfant de l'objet viaself
, tout comme avec les méthodes statiques. Vous peut-être dire la bonne chose, mais vous devez re-phrase. Tout cela seul qui compte vraiment, une fois que les enfants ont les membres nommés identique puisque vous pouvez ensuite décider quels sont ceux à consulter en utilisantstatic::
à la place.Depuis PHP 5.3.0, PHP implémente une fonctionnalité appelée late static binding qui peut être utilisé pour faire référence à la classe appelée dans le contexte de l'héritage statique.
Late static binding tente de résoudre cette limitation par l'introduction d'un mot-clé qui fait référence à la classe qui a été appelée lors de l'exécution. Il a été décidé de ne pas introduire un nouveau mot-clé, mais plutôt d'utiliser
static
qui était déjà réservé.Voyons un exemple:
late static bindings
travail en stockant le nom de la classe dans le dernier "non-renvoi d'appel". Dans le cas de la statique des appels de méthode, c'est la classe explicitement nommés (généralement l'un sur la gauche de l'opérateur::); en cas de non-statique des appels de méthode, c'est la classe de l'objet.Un "renvoi d'appel" est statique qui est introduit par
self::
,parent::
,static::
, ou, si en remontant dans la hiérarchie de classe,forward_static_call()
.La fonction
get_called_class()
peut être utilisé pour récupérer une chaîne de caractères avec le nom de la classe etstatic::
introduit son champ d'application.Il n'est pas très évident comportement:
Le code suivant produit 'alphabeta'.
Cependant, si nous supprimer de la déclaration de la classe de fonction à partir de la version bêta de la classe, nous obtenons 'alphaalpha' comme résultat.
Je suis en citant le livre: "PHP Maître d'écriture de pointe de code".
N'hésitez pas à jeter un coup d'oeil à la documentation officielle de php ainsi:
http://php.net/manual/en/language.oop5.late-static-bindings.php
La façon la plus claire d'expliquer les Late Static Binding est avec un exemple simple. Regardez les deux définitions de classe ci-dessous, et continuez à lire.
Nous voyons une Classe Parent (Véhicule) et d'un Enfant de la Classe (Voiture).
La Classe Parent a 2 méthodes publiques:
invokeDriveByStatic
invokeStopBySelf
La Classe Parente a aussi 2 méthodes privées:
drive
stop
L'Enfant de la Classe remplace 2 méthodes:
drive
stop
Maintenant, nous allons invoquer les méthodes publiques:
invokeDriveByStatic
invokeStopBySelf
Demandez-vous: Qui classe appelle
invokeDriveByStatic
/invokeStopBySelf
? Le Parent ou l'Enfant de la classe?Prendre un coup d'oeil ci-dessous:
La
static
mot-clé est utilisé dans un modèle de conception Singleton.Voir le lien: https://refactoring.guru/design-patterns/singleton/php/example
L'exemple le plus simple de montrer la différence.
Remarque, self::$c
Late static binding, note statique::$c
Par exemple:
La regardant d'un "pourquoi devrais-je l'utiliser?" point de vue, c'est essentiellement un moyen de modifier le contexte à partir duquel la méthode statique est interprété/exécuter.
Avec
self
, le contexte est celui où vous avez défini la méthode à l'origine. Avecstatic
, c'est celui que vous êtes en l'appelant depuis.Aussi, regarder si vous mettez à jour les variables statiques dans les classes enfant. J'ai trouvé ceci (un peu) résultat inattendu où l'enfant B mises à jour enfant C:
Vous pouvez résoudre le problème en déclarant la même variable dans chaque enfant de la classe, par exemple: