升级到 PHP 7 后,日志几乎被这种错误所阻塞:
PHP Warning: Declaration of Example::do($a, $b, $c) should be compatible with ParentOfExample::do($c = null) in Example.php on line 22548
如何在 PHP 7 中消除这些错误并且仅消除这些错误?
在 PHP 7 之前,它们是
E_STRICT
可以轻松处理 的警告类型。现在它们只是普通的旧警告。因为我 确实 想了解其他警告,所以我不能完全关闭所有警告。我没有精神能力重写这些遗留 API,更不用说使用它们的所有软件了。你猜怎么着,没有人会为此付出代价。我一开始就没有开发它们,所以我不应该受到指责。 (单元测试?十年前还不流行。)
我想尽可能避免使用
func_get_args
和类似的 任何 技巧。我真的不想降级到 PHP 5。
我还想知道其他错误和警告。
有没有一种干净漂亮的方法来完成这个?
原文由 sanmai 发布,翻译遵循 CC BY-SA 4.0 许可协议
1.解决方法
由于并非总是可以更正 您未编写 的所有代码,尤其是遗留代码…
对于以
Declaration of
开头的警告,此错误处理程序返回true
,这基本上告诉 PHP 已处理警告。这就是 PHP 不会在别处报告此警告的原因。另外,此代码只能在 PHP 7 或更高版本中运行。
如果您希望仅针对特定代码库发生这种情况,那么您可以检查有错误的文件是否属于该代码库或感兴趣的库:
2.妥善解决
至于实际修复其他人的遗留代码,在许多情况下,这可以在简单和可管理之间完成。在下面的示例中,类
B
是A
的子类。请注意,您不一定会通过遵循这些示例来消除任何 LSP 违规行为。你会这样做:
您可能希望根据严重性使用断言或抛出异常。
如果您发现约束仅用于文档目的,请将它们移到它们所属的位置。
你会这样做:
func_get_args
魔术。不要忘记记录缺少的参数。当然,如果您必须删除多个参数,这会变得非常乏味。
你会这样做:
请注意,我们不能在这里使用
func_get_args()
因为它不考虑默认(未传递)参数。我们只剩下func_num_args()
。这样 LSP 仍然会被违反,尽管没有警告,但您可以保留子类中的所有类型检查。