Maison > base de données > tutoriel mysql > PHP implémente une liaison statique tardive

PHP implémente une liaison statique tardive

小云云
Libérer: 2018-03-17 17:16:10
original
1516 Les gens l'ont consulté

La liaison statique tardive fonctionne en stockant le nom de classe de "l'appel non transféré" précédent (non-forwarding call). Lors d'un appel de méthode statique, le nom de la classe est celui explicitement spécifié (généralement sur le côté gauche de l'opérateur :: lors d'un appel de méthode non statique, il s'agit de la classe à laquelle appartient l'objet) ;

Le soi-disant « appel avant » (forwarding  call) fait référence aux appels statiques effectués des manières suivantes : self::, parent::, static:: et forward_static_call(). Vous pouvez utiliser la fonction get_called_class() pour obtenir le nom de classe de la méthode appelée, et static:: indique sa portée. Limitations de

self ::

Utilisez soit self:: soit __CLASS__ pour une référence statique à la classe actuelle, selon la classe dans laquelle la méthode actuelle est défini :

Exemple :

class  A  {
    public static function  who () {
        echo  __CLASS__ ;
    }    public static function  test () {
         self :: who ();
    }
}class  B  extends  A  {
    public static function  who () {
        echo  __CLASS__ ;
    }
}

B :: test ();
Copier après la connexion

Résultat :

A
Copier après la connexion

statique (liaison statique tardive)

tardive idée originale de liaison statique La limitation est contournée en introduisant un nouveau mot-clé représentant la classe initialement appelée par le runtime. En termes simples, ce mot-clé vous permet de faire référence à la classe B au lieu de A lors de l'appel de test() dans l'exemple ci-dessus. Il a finalement été décidé de ne pas introduire de nouveaux mots-clés, mais d'utiliser les mots-clés static déjà réservés.

Exemple :

<?phpclass A {
    public static function who() {
        echo __CLASS__;
    }    public static function test() {
        static::who(); // 后期静态绑定从这里开始
    }
}class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();?>
Copier après la connexion

Résultat :

B
Copier après la connexion

La différence entre static et $this

Dans un non -environnement statique, la classe appelée est la classe à laquelle appartient l'instance d'objet. Puisque $this-> essaiera d'appeler des méthodes privées dans la même portée, static:: peut donner des résultats différents. Une autre différence est que les propriétés statiques ne peuvent être appelées qu'avec static::.

Exemple : Méthode d'appel privée

<?phpclass A {
    private function foo() {
        echo "success!\n";
    }    public function test() {
        $this->foo();        static::foo();
    }
}class B extends A {
   /* foo() will be copied to B, hence its scope will still be A and
    * the call be successful */}class C extends A {
    private function foo() {
        /* original method is replaced; the scope of the new one is C */
    }
}$b = new B();$b->test();$c = new C();$c->test();   //fails
Copier après la connexion

Résultat :

success!
success!
success!
Fatal error:  Call to private method C::foo() from context &#39;A&#39; in /tmp/test.php on line 9
Copier après la connexion

Appels renvoyés et non transférés

Publier La résolution de liaison statique se poursuit jusqu'à ce qu'un message d'appel statique entièrement résolu soit obtenu. En revanche, si un appel statique est effectué à l'aide de parent:: ou self::, les informations de l'appel seront transférées.

Exemple :

class A {
    public static function foo() {
        static::who();
    }    public static function who() {
        echo __CLASS__."\n";
    }
}class B extends A {
    public static function test() {
        A::foo();        parent::foo();        self::foo();
    }    public static function who() {
        echo __CLASS__."\n";
    }
}class C extends B {
    public static function who() {
        echo __CLASS__."\n";
    }
}

C::test();
Copier après la connexion

Résultat :

ACC
Copier après la connexion

Recommandations associées :

Explication détaillée de la liaison statique tardive de php exemples

Explication détaillée de la liaison statique php

Explication détaillée de la définition et de l'utilisation de la liaison post-statique 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!

Étiquettes associées:
source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal