私はパーティーに遅れていることを知っていますが、答えは実際の問題を実際に説明していません。
問題は、PHPが関数/メソッドのオーバーロードをサポートしていないことです。型指定されていない言語で関数のオーバーロードをサポートすることは困難です。
ヒントが役立ちます。しかし、PHPでは非常に制限されています。理由はわかりません。たとえば、変数がintまたはブール値であることを示唆することはできませんが、配列は問題ありません。フィギュアに行こう!
他のオブジェクト指向言語は、関数のオーバーロードを使用してこれを実装します。つまり、関数のシグネチャは明らかに異なります。
したがって、たとえば、次のことが可能であれば、問題は発生しません。
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について厳格です。