


STATIQUE vs soi: démêler les liaisons statiques tardives en php
Lorsqu'une méthode statique est appelée l'utilisation de soi dans l'héritage, il pointe toujours la classe qui définit la méthode, plutôt que la classe réellement appelée, ce qui entraîne l'incapacité d'appeler la méthode remplacée sous-classe comme prévu; Alors que Static utilise la liaison statique tardive, ce qui peut analyser correctement la classe réellement appelée lors de l'exécution. 1. Self est une liaison précoce, pointant vers la classe où se trouve le code; 2. Static est une liaison tardive, pointant vers la classe d'appel d'exécution; 3. Utilisez statique pour implémenter des méthodes d'usine statiques et renvoyer automatiquement les instances de sous-classe; 4. Statique prend en charge l'analyse correcte des attributs héréditaires dans la chaîne de méthodes; 5. LSB ne convient qu'aux méthodes et attributs statiques, pas pour les constantes; 6. La statique doit être utilisée en premier dans les classes héréditaires pour améliorer la flexibilité et l'évolutivité, qui est largement recommandée dans le PHP moderne.
Lorsque vous travaillez avec l'héritage dans PHP, vous avez probablement rencontré self
et vous vous êtes demandé pourquoi parfois cela ne se comporte pas comme vous vous attendez - en particulier lorsque vous appelez des méthodes statiques des classes enfants. C'est là que les liaisons statiques tardives (LSB) entrent en jeu, et la différence entre self
et static
devient cruelle.
Le problème de self
self
en PHP fait référence à la classe où la méthode est définie , pas nécessairement celle qui l'appelle. Cela signifie qu'il est lié tôt - résolu à l'heure de compilation, pas à l'exécution.
Considérez cet exemple:
classe parentClass { fonction statique publique qui () { echo "parentClass \ n"; } Fonction statique publique callwho () { self :: who (); } } Classe La classe d'enfants étend ParentClass { fonction statique publique qui () { Echo "Classe de sauvetage \ n"; } } Certes d'enfants :: callwho (); // sorties: "parentClass"
Même si nous appelons callWho()
sur ChildClass
, il publie ParentClass
. Pourquoi? Parce que self::who()
Inside ParentClass
se réfèrent toujours à ParentClass::who()
, quel que soit le contexte d'appel.
Ce comportement n'est souvent pas ce que vous voulez lors de la conception de hiérarchies de classe excessives.
Entrez static
: liaisons statiques tardives
PHP 5.3 a introduit les liaisons statiques tardives , permettant à static
de se référer à la classe qui a été appelée au moment de l'exécution - pas où la méthode est définie.
Ajusterons l'exemple en utilisant static
au lieu de self
:
classe parentClass { fonction statique publique qui () { echo "parentClass \ n"; } Fonction statique publique callwho () { statique :: qui (); // Remarque: statique au lieu de soi } } Classe La classe d'enfants étend ParentClass { fonction statique publique qui () { Echo "Classe de sauvetage \ n"; } } Certes d'enfants :: callwho (); // Sorties: "Certes enfants"
Maintenant, il imprime ChildClass
. En effet, static::who()
est résolu à l'exécution en fonction de la classe réelle utilisée dans l'appel - c'est une liaison tardive .
✅ Règle de base:
self
→ fait référence à la classe actuelle (où le code est écrit)static
→ fait référence à la classe appelée (qui peut être un enfant)
Cas d'utilisation pratiques pour static
1. Méthodes d'usine statiques
Vous pouvez créer une méthode d'usine de base qui renvoie les instances de la bonne classe enfant:
Modèle de classe { fonction statique publique create () { retourner new static (); // renvoie l'instance de la classe appelée } } Classe L'utilisateur étend le modèle { // hérite de création (), mais renvoie l'instance utilisateur } $ user = user :: create (); // en fait un objet utilisateur var_dump ($ d'instance utilisateur de l'utilisateur); // vrai
Sans static
, vous devrez remplacer create()
dans chaque classe d'enfants.
2. Méthode chaînage d'héritage
classe queryBuilder { Table $ statique protégé; fonction statique publique tous () { ECHO "Sélectionner parmi". Table statique :: $. "\ n"; } } Classe L'utilisateur étend QueryBuilder { protégé Static $ table = 'utilisateurs'; } User :: all (); // Sorties: "Sélection parmi les utilisateurs"
Encore une fois, static::$table
résout à User::$table
, pas QueryBuilder::$table
.
Mises en garde et limitations
- LSB fonctionne uniquement avec la méthode statique et les appels de propriété.
- Il ne s'applique pas aux constantes (
self::CONST
vsstatic::CONST
toujours à la classe où il est défini). - Soyez prudent lorsque vous utilisez
static
dans les classes finales - pas d'héritage, doncself
etstatic
se comportent de la même manière. - La différence de performance est négligeable; prioriser la clarté et le comportement correct.
Résumé
Mot-clé | Temps de reliure | Se réfère à |
---|---|---|
self
|
Tôt (temps de compilation) | Classe où la méthode est définie |
static
|
En retard (runtime) | Classe réelle appelée |
Utilisez static
lorsque vous souhaitez des méthodes héréditaires pour respecter l'implémentation de la classe d'appel - en particulier dans les bases abstraites, les usines ou les interfaces courantes.
En PHP moderne, favorisez static
par rapport à self
lorsque vous travaillez avec des méthodes statiques dans des classes héritables. Cela rend votre code plus flexible et intuitif.
Fondamentalement: si vous construisez quelque chose signifie être étendu, static
est probablement le bon choix.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Les opérateurs de déconstruction et d'expansion du tableau de PHP peuvent améliorer la lisibilité et la flexibilité du code grâce à une syntaxe concise. 1. La déconstruction du tableau prend en charge l'extraction des valeurs des indices et des tableaux associatifs, tels que [$ premier, $ second] = $ couleurs, qui peuvent être attribuées séparément; Les éléments peuvent être sautés par des espaces réservés vides, tels que [,, $ troisième] = $ couleurs; La déconstruction du tableau associatif nécessite la clé de correspondance => telle que ['name' => $ name] = $ utilisateur, qui prend en charge les variables de renommer et la définition de valeurs par défaut pour traiter les clés manquantes. 2. Expander l'opérateur (...) peut étendre et fusionner des tableaux, tels que [... $ couleurs, «bleu»], qui soutient la combinaison majoritaire et le réécart de tableau associatif, mais les clés suivantes écraseront les premiers et ne se reconstitueront pas.

Php8attributesReplacedocblockSformetAdatabyProvidyType-sea, nativementSupportEnNotations.1.AttributesAreseFinedUsing # [Attribute] et CantargetClasses, méthodes, propriétés, et.2.Il

Oui, phpsyntaxiseasy, surtout pour les billets, car dans une approche, s'intègre àwithhtml, annrequiresminimalsetup.itssyntaxissstraightForward, permettant à la forme de semicolonsohtmlwithtags, en utilisant $ forvariables, semicolonsformets, ainsi

Lorsqu'une méthode statique est appelée l'utilisation de soi dans l'héritage, il pointe toujours la classe qui définit la méthode, plutôt que la classe réellement appelée, ce qui entraîne l'incapacité d'appeler la méthode remplacée sous-classe comme prévu; Alors que Static utilise la liaison statique tardive, ce qui peut analyser correctement la classe réellement appelée lors de l'exécution. 1. Self est une liaison précoce, pointant vers la classe où se trouve le code; 2. Static est une liaison tardive, pointant vers la classe d'appel d'exécution; 3. Utilisez statique pour implémenter des méthodes d'usine statiques et renvoyer automatiquement les instances de sous-classe; 4. Statique prend en charge la résolution correcte des attributs héréditaires dans la chaîne de méthode; 5. LSB ne convient qu'aux méthodes et attributs statiques, pas pour les constantes; 6. La statique doit être utilisée en premier dans les classes héréditaires pour améliorer la flexibilité et l'évolutivité, qui est en pH moderne

Les fonctions variables de PHP et le déballage des paramètres sont implémentées via l'opérateur SPLAT (...). 1. Les fonctions variables utilisent ... $ params pour collecter plusieurs paramètres sous forme de tableaux, qui doivent être à la fin de la liste des paramètres et peuvent coexister avec les paramètres requis; 2. Le déballage des paramètres utilise ... $ tableau pour étendre le tableau dans des paramètres indépendants et le transmettre dans la fonction, adapté aux tableaux d'index numériques; 3. Les deux peuvent être utilisés en combinaison, comme le passage des paramètres dans la fonction de wrapper; 4. PHP8 prend en charge la correspondance des paramètres nommés lors du déballage des tableaux associatifs, et il est nécessaire de s'assurer que le nom de clé est cohérent avec le nom du paramètre; 5. Faites attention à éviter d'utiliser le déballage pour les données non trafiqués, à prévenir les erreurs mortelles et à faire attention à la limite de la quantité de paramètres. Ces fonctionnalités améliorent la flexibilité et la lisibilité du code, réduisant Func_get_args () et ainsi de suite

TheTeternaryOperator (? :) ISUSUDFORSIMPLEIF-ELLOGIC, RetourningOneoftWoduluesBasedonacondition; 2.Thelullcoalescingoperator (??)

PHP8.0'snamedarguments et constructororpropertypromotion improvecodeclarity andreduceboilerplate: 1.NamedargumentsLeTyoupSParametersbyName, améliorant la réadabilité et la commande

Les fonctions de flèche conviennent aux scénarios avec des expressions uniques, des rappels simples et une amélioration de la lisibilité; 2. Les fonctions anonymes conviennent aux scénarios avec logique multi-lignes, flux de contrôle complexe, référençant les variables externes et utilisant des générateurs de rendement; Par conséquent, vous devez choisir en fonction des besoins spécifiques: les scénarios simples hiérarchisent les fonctions flèches pour améliorer la simplicité du code, tandis que les scénarios complexes utilisent des fonctions anonymes pour obtenir un support fonctionnel complet.
