我知道我迟到了,但答案并没有真正说明实际问题。
问题是 PHP 不支持函数/方法重载。在无类型语言中支持函数重载是很困难的。
暗示有帮助。但在 PHP 中它非常有限。不知道为什么。例如,您不能暗示变量是 int 或 Boolean,但数组很好。去搞清楚!
其他面向对象的语言使用函数重载来实现这一点。也就是说函数的签名明显不同。
因此,例如,如果以下情况是可能的,我们就不会有问题
class Foo
{
public function bar(Array $bar){
echo "Foo::bar";
}
}
class Baz extends Foo
{
public function bar(int $bar) {
echo "Baz::bar";
}
}
$foo = new Baz();
$bar = new Baz();
$ar = array();
$i = 100;
$foo->bar($ar);
$bar->bar((int)$i);
would output
Foo::bar
Baz::bar
当然,当涉及到构造函数时,php 开发人员意识到他们必须实现它,不管你喜不喜欢!因此,他们只是在第一种情况下抑制错误或不提出错误。
这是愚蠢的。
一位熟人曾经说过 PHP 实现对象只是作为实现命名空间的一种方式。现在我并不那么挑剔,但做出的一些决定确实倾向于支持该理论。
在开发代码时,我总是打开最大的警告,我从来没有在不了解它的含义和含义的情况下放过警告。就我个人而言,我不关心这个警告。我知道我想做什么,而 PHP 做的不对。我来这里是为了寻找一种选择性抑制它的方法。我还没有找到方法。
所以我会捕获这个警告并自己压制它。可惜我需要这样做。但我对 STRICT 很严格。