145 votes

Liaison tardive statique en PHP, c’est quoi exactement ?

Liaison tardive statique en PHP, c’est quoi exactement ?

214voto

zombat Points 46702

Vous devez absolument lire Late Static Bindings dans le manuel PHP. Cependant, je vais essayer de vous donner un rapide résumé.

En gros, ça se résume au fait que l' 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é. 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 l' static mot-clé, qui traite de cette lacune. Lorsque vous utilisez static, 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 dont self, parent et static fonctionner lors de l' static 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.

85voto

Mrinmoy Ghoshal Points 806

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:

<?php
    class Car 
    {
        public static function run() 
        {
            return static::getName();
        }

        private static function getName() 
        {
            return 'Car';
        }
    }

    class Toyota extends Car 
    {
        public static function getName() 
        {
            return 'Toyota';
        }
    }

    echo Car::run(); // output: Car
    echo Toyota::run(); // output: Toyota.
?>

late static bindings de 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-statiques, les appels de méthode, c'est la classe de l'objet.

Un "renvoi d'appel" est statique qui est introduit par l' self::, parent::, static::, ou, si en remontant dans la hiérarchie de classe, forward_static_call().

La fonction get_called_class() peut être utilisée pour récupérer une chaîne de caractères avec le nom de la classe et de l' static:: présente son champ d'application.

27voto

Jokerius Points 194

Il n’y a pas de comportement très évidente : après le code produit « alphabeta »

Cependant si on enlève la déclaration de fonction classname de classe beta, nous recevons la « alphaalpha » dans le résultat.

7voto

Don Neufeld Points 12803

Il y a un doc pour ça :

PHP : Fin liaisons statiques

5voto

Petah Points 18432

Par exemple :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X