Table des matières
Entrez static : liaisons statiques tardives
Cas d'utilisation pratiques pour static
1. Méthodes d'usine statiques
2. Méthode chaînage d'héritage
Mises en garde et limitations
Résumé
Maison développement back-end tutoriel php STATIQUE vs soi: démêler les liaisons statiques tardives en php

STATIQUE vs soi: démêler les liaisons statiques tardives en php

Jul 26, 2025 am 09:50 AM
PHP Syntax

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.

STATIQUE vs soi: démêler les liaisons statiques tardives en php

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 vs static::CONST toujours à la classe où il est défini).
  • Soyez prudent lorsque vous utilisez static dans les classes finales - pas d'héritage, donc self et static 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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

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

Porce de variable PHP expliquée
1 Il y a quelques mois By 百草
Commentant le code en php
4 Il y a quelques semaines By 百草
Conseils pour écrire des commentaires PHP
4 Il y a quelques semaines By 百草
<🎜>: Grow A Garden - Guide complet des marchands itinérants
3 Il y a quelques semaines By Jack chen

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Sujets chauds

Tutoriel PHP
1510
276
Maîtrise de la destruction de la baie PHP et l'opérateur de propagation Maîtrise de la destruction de la baie PHP et l'opérateur de propagation Jul 25, 2025 am 04:44 AM

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.

Une introduction aux attributs PHP 8: remplacer les docblocks par des métadonnées structurées Une introduction aux attributs PHP 8: remplacer les docblocks par des métadonnées structurées Jul 25, 2025 pm 12:27 PM

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

La syntaxe PHP est-elle facile? La syntaxe PHP est-elle facile? Jul 17, 2025 am 04:12 AM

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

STATIQUE vs soi: démêler les liaisons statiques tardives en php STATIQUE vs soi: démêler les liaisons statiques tardives en php Jul 26, 2025 am 09:50 AM

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

Comprendre les fonctions variadiques et le déballage des arguments en php Comprendre les fonctions variadiques et le déballage des arguments en php Jul 25, 2025 am 04:50 AM

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

Démystifier les opérateurs ternaires, nuls de coalescence et nulsafe de PHP Démystifier les opérateurs ternaires, nuls de coalescence et nulsafe de PHP Jul 25, 2025 pm 04:48 PM

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

Tirer parti des arguments nommés et de la promotion des propriétés du constructeur dans PHP moderne Tirer parti des arguments nommés et de la promotion des propriétés du constructeur dans PHP moderne Jul 24, 2025 pm 10:28 PM

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

Fonctions anonymes PHP par rapport aux fonctions de flèche: une plongée profonde de syntaxe Fonctions anonymes PHP par rapport aux fonctions de flèche: une plongée profonde de syntaxe Jul 25, 2025 pm 04:55 PM

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.

See all articles