【问题标题】:Method overwrite with different declarations in PHP7在 PHP7 中用不同的声明覆盖方法
【发布时间】:2017-10-07 17:24:33
【问题描述】:

我有两个较旧的 extbase 扩展 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:“请接受这个”?

(示例代码有点抽象,但问题应该很清楚,并且贯穿了整个扩展。没有克服这个问题的好主意,我认为扩展需要完全重新设计。)

【问题讨论】:

标签: typo3 php-7 extbase


【解决方案1】:

你正在破坏Liskov Substitution Principle。就面向对象的设计而言,这是非常糟糕的。简而言之,如果你有一个对象,那么在你使用该对象的任何地方,你都应该能够使用该对象的子类。

它是intended to guarantee semantic interoperability。换句话说,它旨在节省您和其他程序员的时间,以及花在试图理解您的程序上的时间。不仅是你的程序员伙伴,还有所有的工具,比如静态分析器,它们可以保护你免受罕见错误的影响,让你的生活更轻松。

如果您认为您的代码应该只适用于公共对象的某个子类型,那么这是一个不属于函数签名的约束。将它移到函数的主体,无论是断言还是异常,然后继续。

【讨论】:

    猜你喜欢
    • 2018-06-28
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多