2016-06-17 15 views
7

Questa violazione LSP raises a Fatal Error:Perché le violazioni LSP in PHP a volte sono fatali ea volte gli avvisi?

abstract class AbstractService { } 
abstract class AbstractFactory { abstract function make(AbstractService $s); } 
class ConcreteService extends AbstractService { } 
class ConcreteFactory extends AbstractFactory { function make(ConcreteService $s) {} } 

Questa violazione LSP 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) {} } 

Mentre questa violazione LSP solo raises a Warning:

class Service { } 
class Factory { function make(Service $s) {} } 
class MyService extends Service { } 
class MyFactory extends Factory { function make(MyService $s) {} } 

Perché? Non dovrebbero essere tutti fatali dal momento che sono tutti controversi?

risposta

8

Nel primo caso, si tratta di un errore fatale, perché PHP requires you to be compatible with a parent abstract class:

Quando eredita da una classe astratta ... firme dei metodi devono corrispondere.

Il same is true nel secondo caso:

La classe implementa l'interfaccia deve utilizzare esattamente gli stessi metodi firme sono definiti nell'interfaccia. In caso contrario, si verificherà un errore irreversibile.

Nel terzo caso, si estende una normale classe PHP, non astratta. PHP ti permette di cambiare la firma, anche se con un avvertimento.

Ovviamente non è una buona pratica e viola LSP come si fa notare. Solo uno dei tanti modi in cui PHP ti offre oggetti nitidi e ti fa male se non stai attento. =)

Se si desidera applicare LSP, è necessario utilizzare un'interfaccia, astratta, o rendere il metodo final nella classe padre.

Ecco un esempio di final: https://3v4l.org/s42XG

+0

seguo la meccanica, ma non capisco la logica. Zeev ha aggiunto la restrizione in 5.0.0-rc2 secondo [Changelog] (http://php.net/ChangeLog-5.php), ma non mi è chiaro se fosse per LSP o per un altro motivo e se polimorfo è -le relazioni sono state ignorate per BC con classi PHP 4. – bishop

+0

"PHP ti offre oggetti nitidi e ti fa male se non stai attento". Così vero. Suppongo che la logica si perda nella notte dei tempi. – bishop

Problemi correlati