Ten LSP naruszenie raises a Fatal Error:Dlaczego naruszenia LSP w PHP są czasami śmiertelne, a czasem ostrzeżenia?
abstract class AbstractService { }
abstract class AbstractFactory { abstract function make(AbstractService $s); }
class ConcreteService extends AbstractService { }
class ConcreteFactory extends AbstractFactory { function make(ConcreteService $s) {} }
Ten LSP naruszenie 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) {} }
Chociaż naruszenie LSP tylko raises a Warning:
class Service { }
class Factory { function make(Service $s) {} }
class MyService extends Service { }
class MyFactory extends Factory { function make(MyService $s) {} }
Dlaczego? Czy nie wszystkie powinny być śmiertelne, ponieważ wszystkie są sprzeczne?
śledzę mechanikę, ale nie rozumiem uzasadnienie. Zeev dodał ograniczenie w wersji 5.0.0-rc2 zgodnie z [Changelog] (http://php.net/ChangeLog-5.php), ale nie jest dla mnie jasne, czy było to dla LSP czy z innego powodu, a jeśli polimorficzny jest - relacje zostały pominięte dla BC z klasami PHP 4. – bishop
"PHP daje ostre przedmioty i pozwala zranić się, jeśli nie jesteś ostrożny". Tak prawdziwe. Przypuszczam, że rozsądek ginie w mgłach czasu. – bishop