Dieser LSP Verletzung raises a Fatal Error:Warum sind LSP-Verletzungen in PHP manchmal tödlich und manchmal Warnungen?
abstract class AbstractService { }
abstract class AbstractFactory { abstract function make(AbstractService $s); }
class ConcreteService extends AbstractService { }
class ConcreteFactory extends AbstractFactory { function make(ConcreteService $s) {} }
Dieser LSP Verletzung also raises a Fatal Error:
interface AbstractService { }
interface AbstractFactory { function make(AbstractService $s); }
class ConcreteService implements AbstractService { }
class ConcreteFactory implements AbstractFactory { function make(ConcreteService $s) {} }
Während diese LSP Verletzung nur raises a Warning:
class Service { }
class Factory { function make(Service $s) {} }
class MyService extends Service { }
class MyFactory extends Factory { function make(MyService $s) {} }
Warum? Sollten sie nicht alle fatal sein, da sie alle kontravariant sind?
ich die Mechanik folgen, aber ich verstehe nicht, die Gründe. Zeev hat die Einschränkung in 5.0.0-rc2 gemäß [Changelog] (http://php.net/ChangeLog-5.php) hinzugefügt, aber es ist mir nicht klar, ob das für LSP oder einen anderen Grund war und ob es polymorph ist -a Relationen wurden für BC mit PHP 4-Klassen übersprungen. – bishop
"PHP gibt Ihnen scharfe Objekte, und Sie können sich verletzen, wenn Sie nicht aufpassen". So wahr. Ich nehme an, die Logik ist im Nebel der Zeit verloren. – bishop