2017-05-09 2 views
0

Ich habe zwei ältere extbase Erweiterungen A und B. Ext B erweitert das Personenmodell und Controller von A und überschreibt die ShowAction. Das erweiterte Modell wird "Personcc" genannt, während das ursprüngliche Modell "Person" genannt wurde. Die showaction sieht aus wieMethode überschreiben mit verschiedenen Deklarationen in PHP7

//show action in Controller of EXT A 
public function showAction(Vendor\Ext\Domain\Model\Person = $person) { 
    ... 
} 

//show action of extending controller:  
public function showAction(Vendor\Ext\Domain\Model\Personcc = $person) { 
    ... 
} 

Jetzt muss ich die Erweiterungen aktualisieren, um sie mit PHP7 zu bekommen arbeiten. In PHP5 funktioniert es so, aber nicht in PHP 7. Der Fehler ist, dass die Deklaration "kompatibel sein sollte". Was kann ich tun, um Ext B komplett neu aufzubauen? Gibt es eine Möglichkeit, PHP7 zu sagen: "Bitte akzeptieren"?

(Der Beispielcode ist ein bisschen abstrakt, aber das Problem sollte klar sein, und es geht durch die gesamte Ausdehnung. Ohne eine gute Idee, dies zu überwinden, ich denke, die Erweiterung komplett überarbeitet werden muss.)

+2

Siehe: http://StackOverflow.com/questions/36079651/Silence-Declaration-Should-Be-Compatible-Warnings-in-PHP-7 –

Antwort

0

Du brichst Liskov Substitution Principle. In Bezug auf das objektorientierte Design ist das sehr schlecht. Kurz gesagt, wenn Sie ein Objekt haben, dann sollten Sie überall, wo Sie das Objekt verwenden, eine Unterklasse dieses Objekts verwenden können.

Es ist intended to guarantee semantic interoperability. Mit anderen Worten, es ist beabsichtigt, Ihre Zeit zu sparen, und Ihre Kollegen Programmierer Zeit, die Zeit verbringen versuchen, Ihr Programm zu verstehen. Nicht nur Ihre Kollegen Programmierer, sondern alle Werkzeuge wie statische Analysatoren, die Ihr eigenes Leben erleichtern sollten, indem Sie Sie vor seltenen Fehlern schützen.

Wenn Sie der Meinung sind, dass der Code nur mit einem bestimmten Subtyp eines gemeinsamen Objekts arbeiten soll, handelt es sich um eine Einschränkung, die nicht zur Signatur der Funktion gehört. Verschieben Sie es zum Körper der Funktion, sei es eine Behauptung oder eine Ausnahme, und machen Sie weiter.