Maison >développement back-end >Problème PHP >Quelle est la différence entre self et static en php

Quelle est la différence entre self et static en php

青灯夜游
青灯夜游original
2021-05-08 18:15:383057parcourir

La différence entre self et static en PHP : self ne peut faire référence qu'aux méthodes de la classe actuelle, tandis que static permet aux appels de fonction de lier les méthodes de la classe appelante au moment de l'exécution.

Quelle est la différence entre self et static en php

L'environnement d'exploitation de ce tutoriel : système Windows 7, PHP version 7.1, ordinateur DELL G3

La différence entre self et static en php

A travers quelques exemples, nous pouvons facilement voir la différence entre self et static. Supposons que nous ayons la classe Car – elle a deux méthodes, model et getModel. Notez que nous utilisons ici le mot-clé self.

class Car
{
    public static function model()
    {
         self::getModel();
    }

    protected static function getModel()
    {
        echo "I am a Car!";
    }

}

Appelez la méthode statique

Car::model();

et obtenez le résultat

I am a Car!

Le mot-clé self nous amène à appeler la méthode getModel de la classe Car et à afficher le texte "Je suis un Voiture!".

Ensuite on ajoute une nouvelle classe, la classe Mercedes, qui hérite de la classe Car, le code est le suivant :

class Mercedes extends Car{

    protected static function getModel()
    {
        echo "I am a Mercedes!";
    }

}

Quand on appelle Mercedes::model(), devinez quel est le résultat ?
Peut-être pensez-vous que le résultat sera :

I am a Mercedes!

Mais le résultat réel est :

I am a Car!

Pourquoi est-ce ?

Explication de soi

Le principe de fonctionnement du mot-clé "self" est le suivant : il appellera la méthode de la classe actuelle (classe actuelle). Étant donné que la méthode model n’est définie que dans la classe Car, la classe actuelle est la classe Car pour elle. Self::getModel() dans le modèle appelle naturellement la méthode getModel dans la classe Car.

Ce comportement ne semble pas être ce que nous souhaitons et il n'est pas conforme aux principes de conception orientée objet. Comment le résoudre ? Vous pouvez utiliser le mot clé static.

Mot-clé statique et liaison statique tardive (liaison statique tardive)

Dans PHP5.3, une nouvelle fonctionnalité est ajoutée appelée liaison statique retardée. Cela peut nous aider à réaliser le polymorphisme et à résoudre les problèmes ci-dessus. En termes simples, la liaison statique retardée signifie que lorsque nous appelons une méthode héritée avec le mot-clé static, elle sera liée à la classe appelante au moment de l'exécution. Dans l'exemple ci-dessus, si nous utilisons une liaison statique retardée (static), cela signifie que lorsque nous appelons "Mercedes::model();", la méthode getModel de la classe Mercedes sera appelée. Parce que Mercedes est notre classe d'appel. Exemple de liaison retardée

class Car{
    public static function model()
    {
         static::getModel();
    }    protected static function getModel()
    {
        echo "I am a Car!";
    }

}

Nous venons de remplacer nous-mêmes en classe Car par des statiques et n'avons pas modifié la classe Mercedes.

Maintenant, nous appelons

Mercedes::model();

pour obtenir le résultat

I am a Mercedes!

Les versions inférieures à PHP 5.3 ne peuvent pas utiliser la liaison statique retardée

Notez que les versions antérieures à PHP 5.3 ne peuvent pas utiliser liaison statique retardée. Si vous essayez d'exécuter l'exemple ci-dessus sur une version inférieure à PHP 5.3, une erreur sera signalée.

Self et static en php

Maintenant, nous remplaçons self dans l'exemple par static. Vous pouvez voir que la différence entre les deux est la suivante : self fait référence à la méthode de la classe actuelle (classe actuelle), tandis que static permet aux appels de fonction de lier les méthodes de la classe appelante au moment de l'exécution.

Apprentissage recommandé : "

Tutoriel vidéo PHP

"

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:
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