如何沉默警告

时间:2011-05-09 14:56:51

标签: php error-handling

我有一个继承自另一个班级的班级 我正在重载一种方法; PHP对此大肆宣传。
我如何沉默这条消息?它使我的调试日志变得混乱。

  

宣言   Dashboard_Abstract :: factory()应该   与...的兼容   抽象工厂::()

class Abstract{
  static public function factory($param){
  ...
  ...
  }
}


class Dashboard_Abstract extends Abstract{
  static public function factory($param1,$param2){
  ...
  ...
  }
}

看看,其他开发者。错误和警告之间存在差异: 意思是,

  

“看,如果你是新手,你   可能在这里做错了,   如果你有经验,你可能会   做得对,所以我们会让你,   开发者,决定。“

那么,你为什么不让我决定? 使用所有语言能力是否如此糟糕,即使有人认为这是一个错误(尽管显然不是)。

5 个答案:

答案 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