我有一个继承自另一个班级的班级
我正在重载一种方法; PHP对此大肆宣传。
我如何沉默这条消息?它使我的调试日志变得混乱。
宣言 Dashboard_Abstract :: factory()应该 与...的兼容 抽象工厂::()
class Abstract{
static public function factory($param){
...
...
}
}
class Dashboard_Abstract extends Abstract{
static public function factory($param1,$param2){
...
...
}
}
看看,其他开发者。错误和警告之间存在差异: 意思是,
“看,如果你是新手,你 可能在这里做错了, 如果你有经验,你可能会 做得对,所以我们会让你, 开发者,决定。“
那么,你为什么不让我决定? 使用所有语言能力是否如此糟糕,即使有人认为这是一个错误(尽管显然不是)。
答案 0 :(得分:3)
您可以使用error_reporting()
函数在运行时覆盖它,并且php.ini中有一个名称相同的参数,您可以将其设置为永久更改。但是,警告是有原因的,通常你应该修改你的代码,而不是只是沉默它们。
答案 1 :(得分:1)
好吧,因为它是一个专门的类,所以改变方法签名不应该触发警告。它不是纯OOP语言。 E_STRICT实际上是一种特殊的用途警告信息(试图强加非语义编码标准)。
但无论如何,您的案例有一个简单的解决方法。您可以通过在重写方法中使参数可选来使方法签名兼容:
class Abc {
static public function factory($param) { }
}
class Xyz extends Abc {
static public function factory($param1, $param2=NULL) { }
}
注意重载方法签名中的$param2=NULL
。有了这个技巧,仍然可以在需要父对象的地方使用更专业的类/对象
如果需要,您可以在方法中使用assert($param2!==NULL)
。
(对于静态工厂方法中最终未定义的参数的E_STRICT通知 - 它们只与显式类名一起使用 - 在这里确实没有意义。但是在php.net实现中不会得到修复http://bugs.php.net/bug.php?id=41461。 )
答案 2 :(得分:0)
您没有正确覆盖它,因为变量的数量已经改变。它应该会继续对你大喊大叫。保持参数的数量相同,如果必须,使用默认参数。
答案 3 :(得分:0)
你应该解决问题。如果您有子类覆盖父类中的方法,则该方法的签名必须兼容。这意味着它必须具有相同或更高的可见性,相同的静态性(?!)和相同数量或更少的参数。
Abstract
应该采用两个参数,或者Dashboard_Abstract
应该采用一个参数。如果没看到这些类实际上做了什么,我无法告诉你应该走哪条路。
答案 4 :(得分:0)
你不应该沉默那条消息,而应该确保覆盖方法与原始方法兼容。如果需要覆盖方法来接受不同数量的参数,则可以重写原始方法以使用动态参数列表 - 请参阅http://php.net/manual/en/function.func-get-args.php