Php 删除父类中的空函数是否安全?

Php 删除父类中的空函数是否安全?,php,oop,zend-framework,extends,function-declaration,Php,Oop,Zend Framework,Extends,Function Declaration,我在几乎所有CMS类中都有公共函数beforeDelete()。不幸的是,在我之前,一些聪明的人用($rowId)param创建了其中一些,而其中一些根本没有参数 父级主\u管理\u模块有如下空函数声明: public function beforeDelete() {} 但正因为如此,我得到了错误 错误:模型“”的声明shopCategories::beforeDelete()应为 与Admin_Module_Main::beforeDelete()兼容 因为(显然)带有($rowId)的声

我在几乎所有CMS类中都有公共函数beforeDelete()。不幸的是,在我之前,一些聪明的人用
($rowId)
param创建了其中一些,而其中一些根本没有参数

父级
主\u管理\u模块
有如下空函数声明:

public function beforeDelete() {}
但正因为如此,我得到了错误

错误:模型“”的声明shopCategories::beforeDelete()应为 与Admin_Module_Main::beforeDelete()兼容

因为(显然)带有
($rowId)
的声明与
(空)
的声明不兼容

不幸的是,这会阻止Json响应,因为响应体包含错误,因此已损坏,所以我想修复这个问题


我的问题是:我能简单地摆脱parent方法吗?还是应该在delete之前重写每个child来解决这个问题?我试图在父方法中执行
($rowId=null)
,但它不起作用。

在我看来,基本方法是一个不必要的负担,因为它不做任何事情,并且强制执行所有子类都不能遵循的规则。特别是如果在不同的情况下使用不同的参数调用它,则此方法不应该是
Admin\u Module\u Main
类的公共API的一部分

我的建议是从
Admin\u Module\u Main
中删除
beforeDelete()
方法


不需要删除基本方法的替代方法是遍历
Admin\u Module\u Main
的每个子类,并将参数设置为可选(加上处理可选参数中默认值的代码)。如果您不完全了解
beforeDelete()
方法的调用方,那么这可能是一个更好的解决方案。

如果您不想修复所有类中的代码,可以避免此错误的解决方案之一是更改错误报告级别。转到php.ini配置并以类似的方式更新错误报告

error_reporting = E_ALL & ~E_STRICT
或者在代码中做什么

error_reporting(E_ALL ^ E_STRICT);

E_STRICT level是您看到此错误消息的原因。

在父子
public/protected/private
中,这些函数的可见性如何?您应该重写所有方法,并确保它们一致。您可以使用接口强制方法签名是一致的。@jitendrapurohit public,它们都是(所有模型和父模型)public@GerardRoche这很不幸,但为什么它不让我通过在Main_模块中使用默认值来绕过它呢?使用
public函数beforeDelete($rowId=null){}
它不会让您绕过它,因为它与
Admin\u Module\u Main::beforeDelete()中的声明不兼容。这意味着您的方法签名必须与
Admin\u Module\u Main::beforeDelete()
中的签名相同。可能存在该方法的有效原因。例如,系统的某些其他部分可能期望该方法存在。删除它意味着扩展它的每个类都需要创建该方法。直到运行时,您才知道扩展该类的所有类是否都定义了该方法。如果系统的另一部分希望
beforeDelete()
存在并接受0个参数,则如果存在一个期望超过0个参数的重写,则程序将失败—这里也有这种情况。我坚持我的观点,即如果需要不同数量的参数,则此方法不能作为
Admin\u Module\u Main
的一部分。子方法可以有其他可选参数。参见示例2,这是另一种可能性。添加到我的答案中。这只是隐藏了问题。默认情况下,我启用了它,但是如果我自己犯了错误,我需要再次验证它,这同样会导致ajax和JSONY出现问题。您应该仔细阅读我的解释。它不仅隐藏了它允许使用这种代码的问题。如果您有数百个遗留控制器,我希望您能够在一次迭代中修复所有这些控制器@GerardRoche@AndrejLudinovskov我想我会同意杰拉德·罗什的观点。我现在不得不这样使用它,我在任何项目中都没有看到这样的东西能让开发人员受益,而不是混淆和进行调试,尤其是优化harder@VladimirLitovkin这取决于你。如果你有时间重构,就去做吧。