Maison  >  Article  >  développement back-end  >  Pourquoi ne puis-je pas remplacer les paramètres de méthode avec une interface enfant en tant que nouveau paramètre en PHP ?

Pourquoi ne puis-je pas remplacer les paramètres de méthode avec une interface enfant en tant que nouveau paramètre en PHP ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-06 08:47:02964parcourir

Why Can't I Override Method Parameters with a Child Interface as a New Parameter in PHP?

Surcharge des paramètres de méthode avec l'interface enfant comme nouveau paramètre : pourquoi cela échoue

En PHP, la substitution de méthode permet à une sous-classe de redéfinir le comportement d'une méthode héritée de la classe parent. Cependant, certaines restrictions sont en place pour garantir la compatibilité des types et le respect des principes de la POO.

Considérez l'extrait de code suivant, qui tente de remplacer la méthode setEngine() dans l'interface WaterCar avec un nouveau paramètre de type HydroEngine. :

<code class="php"><?php

interface Engine {

    function run();
}

interface HydroEngine extends Engine {

    function run();
}

interface Car {

    function setEngine(Engine $engine);

}

interface WaterCar extends Car {

    function setEngine(HydroEngine $engine);
}

?></code>

Cet extrait de code échoue avec l'erreur suivante :

Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)

La raison de cette erreur est que le remplacement des paramètres de la méthode viole le principe de substitution de Liskov. L'interface WaterCar déclare un type de paramètre différent pour sa méthode setEngine() que l'interface Car.

Plus précisément, l'interface Car attend un paramètre de type Engine, tandis que l'interface WaterCar attend un paramètre de type HydroEngine. Même si HydroEngine est une sous-classe d'Engine, elle est toujours considérée comme un type différent.

Par conséquent, une classe qui implémente WaterCar peut ne pas être en mesure d'implémenter complètement Car car elle ne peut pas accepter un paramètre Engine. Cela enfreint le principe de substitution de Liskov, qui stipule qu'un sous-type doit pouvoir être utilisé à la place de son type parent sans provoquer de comportement inattendu.

En d'autres termes, si une fonction attend une voiture, elle devrait pouvoir d'accepter un WaterCar sans aucun problème. Cependant, dans ce cas, la fonction échouerait si elle passait un WaterCar car elle attend un paramètre Engine.

Pour résoudre ce problème, il est nécessaire de maintenir la compatibilité des paramètres de méthode entre les interfaces parent et enfant. Si des comportements spéciaux sont requis pour certaines sous-classes, il est préférable de définir des méthodes supplémentaires plutôt que de remplacer les types de paramètres.

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