我有两个旧的extbase Extensions A和B. Ext B扩展了A的Person Model和Controller并覆盖了showAction。扩展模型名为“Personcc”,而原始模型名为“Person”。 showAction看起来像
//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) {
...
}
现在我必须更新扩展以使它们与PHP7一起使用。在PHP5中,它的工作方式与此类似,但在PHP 7中则不然。错误是,声明“应该兼容”。 除了完全重建Ext B之外,我还能做些什么?有没有办法说PHP7:“请接受这个”?
(示例代码有点抽象,但问题应该是明确的,并且它贯穿整个扩展。没有一个好主意来克服这个问题,我认为扩展需要完全重做。)
答案 0 :(得分:0)
你正在打破Liskov Substitution Principle。在面向对象设计方面,这是非常糟糕的。简而言之,如果您有一个对象,那么在您使用该对象的任何地方,您都应该能够使用该对象的子类。
是intended to guarantee semantic interoperability。换句话说,它旨在节省您的时间,以及您的同事程序员花费时间,花在尝试理解您的程序上的时间。不仅是你的程序员,还有静态分析器等所有工具,通过防范罕见的错误,让你的生活变得更轻松。
如果您认为代码应仅适用于公共对象的某个子类型,那么这是一个不属于函数签名的约束。将其移至函数体,无论是断言还是异常,继续前进。