103 votes

plusieurs façons d'appeler la méthode parentale en php

Au début, je ne comprenais pas pourquoi les deux appels de méthode dans le constructeur fonctionnaient, mais maintenant je pense avoir compris. Les classes d'extension héritent des méthodes du parent comme si elles étaient déclarées dans la classe elle-même, ET les méthodes existent dans le parent, donc les deux devraient fonctionner.

Je me demande maintenant s'il existe une manière préférée (c'est-à-dire une meilleure pratique) d'appeler la méthode (par l'intermédiaire de parent ou this ), et si oui ou non il s'agit de moyens réellement identiques d'exécuter le même code, ou s'il y a des réserves à faire en utilisant l'un plutôt que l'autre.

Désolé, je suis probablement en train de trop réfléchir.

abstract class Animal {

    function get_species() {

        echo "test";

    }

}

class Dog extends Animal {

    function __construct(){

        $this->get_species();
        parent::get_species();

    }

}

$spike = new Dog;

142voto

Anthony Points 14424

Il existe trois scénarios (auxquels je pense) dans lesquels vous appelez une méthode dans une sous-classe alors que la méthode sort dans la classe mère :

  1. La méthode n'est pas écrasée par la sous-classe, elle n'existe que dans le parent.

    C'est la même chose que dans votre exemple, et il est généralement préférable d'utiliser $this -> get_species(); Vous avez raison de dire que dans ce cas, les deux sont effectivement les mêmes, mais la méthode a été héritée par la sous-classe, il n'y a donc aucune raison de faire la différence. En utilisant $this vous restez cohérent entre les méthodes héritées et les méthodes déclarées localement.

  2. La méthode est écrasée par la sous-classe et possède une logique totalement différente de celle du parent.

    Dans ce cas, vous voudriez évidemment utiliser $this -> get_species(); parce que vous ne voulez pas que la version parentale de la méthode soit exécutée. Encore une fois, en utilisant systématiquement $this vous n'avez pas à vous soucier de la distinction entre ce cas et le premier.

  3. La méthode étend la classe parent, en ajoutant à ce que la méthode parent réalise.

    Dans ce cas, vous voulez toujours utiliser `$this -> get_species(); lors de l'appel de la méthode à partir d'autres méthodes de la sous-classe. Le seul endroit où vous appellerez la méthode parent sera à partir de la méthode qui écrase la méthode parent. Exemple :

    abstract class Animal {
    
        function get_species() {
    
            echo "I am an animal.";
    
        }
    
     }
    
     class Dog extends Animal {
    
         function __construct(){
    
             $this->get_species();
         }
    
         function get_species(){
    
             parent::get_species();
             echo "More specifically, I am a dog.";
         }
    }

Le seul scénario que je puisse imaginer où vous auriez besoin d'appeler la méthode parentale directement en dehors de la méthode de surcharge serait si elles faisaient deux choses différentes et que vous saviez que vous aviez besoin de la version parentale de la méthode, et non de la locale. Cela ne devrait pas être le cas, mais si cela se présentait, la façon la plus propre d'aborder le problème serait de créer une nouvelle méthode avec un nom comme get_parentSpecies() où tout ce qu'il fait est d'appeler la méthode parent :

function get_parentSpecies(){

     parent::get_species();
}

Encore une fois, cela permet de conserver une certaine cohérence, en autorisant les changements/modifications de la méthode locale plutôt que de s'appuyer sur la méthode parente.

7voto

hackartist Points 3193

À moins que je ne comprenne mal la question, j'utiliserais presque toujours $this->get_species parce que la sous-classe (dans ce cas, dog) pourrait écraser cette méthode puisqu'elle l'étend. Si la classe dog ne redéfinit pas la méthode, les deux méthodes sont équivalentes d'un point de vue fonctionnel, mais si, à un moment donné, vous décidez que la méthode get_species de dog doit imprimer "dog", vous devrez revenir en arrière et modifier tout le code.

Lorsque vous utilisez $this, il fait en fait partie de l'objet que vous avez créé et sera donc toujours le plus à jour (si la propriété utilisée a changé d'une manière ou d'une autre pendant la durée de vie de l'objet), alors qu'en utilisant la classe parent, vous appelez la méthode statique de la classe.

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