Heim  >  Artikel  >  Backend-Entwicklung  >  Warum kann ich Methodenparameter mit einer untergeordneten Schnittstelle nicht als neuen Parameter in PHP überschreiben?

Warum kann ich Methodenparameter mit einer untergeordneten Schnittstelle nicht als neuen Parameter in PHP überschreiben?

Barbara Streisand
Barbara StreisandOriginal
2024-11-06 08:47:02958Durchsuche

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

Überschreiben von Methodenparametern mit untergeordneter Schnittstelle als neuem Parameter: Warum es fehlschlägt

In PHP ermöglicht das Überschreiben von Methoden einer Unterklasse, das Verhalten neu zu definieren einer von der übergeordneten Klasse geerbten Methode. Es gelten jedoch bestimmte Einschränkungen, um die Typkompatibilität und die Einhaltung der OOP-Prinzipien sicherzustellen.

Beachten Sie den folgenden Codeausschnitt, der versucht, die setEngine()-Methode in der WaterCar-Schnittstelle mit einem neuen Parameter vom Typ HydroEngine zu überschreiben :

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

Dieser Codeausschnitt schlägt mit dem folgenden Fehler fehl:

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

Der Grund für diesen Fehler ist, dass das Überschreiben von Methodenparametern gegen das Liskov-Substitutionsprinzip verstößt. Die WaterCar-Schnittstelle deklariert für ihre setEngine()-Methode einen anderen Parametertyp als die Car-Schnittstelle.

Konkret erwartet die Car-Schnittstelle einen Parameter vom Typ Engine, während die WaterCar-Schnittstelle einen Parameter vom Typ HydroEngine erwartet. Obwohl HydroEngine eine Unterklasse von Engine ist, wird sie dennoch als ein anderer Typ betrachtet.

Aus diesem Grund ist eine Klasse, die WaterCar implementiert, möglicherweise nicht in der Lage, Car vollständig zu implementieren, da sie keinen Engine-Parameter akzeptieren kann. Dies verstößt gegen das Liskov-Substitutionsprinzip, das besagt, dass ein Untertyp anstelle seines übergeordneten Typs verwendet werden kann, ohne dass es zu unerwartetem Verhalten kommt.

Mit anderen Worten: Wenn eine Funktion ein Auto erwartet, sollte sie dazu in der Lage sein ein WaterCar ohne Probleme zu akzeptieren. In diesem Fall würde die Funktion jedoch fehlschlagen, wenn ein WaterCar übergeben würde, da sie einen Engine-Parameter erwartet.

Um dieses Problem zu beheben, ist es notwendig, die Kompatibilität der Methodenparameter zwischen übergeordneten und untergeordneten Schnittstellen aufrechtzuerhalten. Wenn für bestimmte Unterklassen besondere Verhaltensweisen erforderlich sind, ist es besser, zusätzliche Methoden zu definieren, anstatt Parametertypen zu überschreiben.

Das obige ist der detaillierte Inhalt vonWarum kann ich Methodenparameter mit einer untergeordneten Schnittstelle nicht als neuen Parameter in PHP überschreiben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn