は、次のように無効なプログラムです"Strict Standards"がPHPコンストラクタに適用されないのはなぜですか? PHP(5.6以下)の最近のバージョンで
error_reporting(E_ALL);
class A
{
public function hello(X $one, Y $two)
{
}
}
class B extends A
{
public function hello()
{
}
}
interface X
{
}
interface Y
{
}
$b = new B;
PHPはこれを実行することを拒否し、代わりにあなたの次
PHP Strict standards: Declaration of B::hello() should be compatible with A::hello(X $one, Y $two) in test.php on line 15
Strict standards: Declaration of B::hello() should be compatible with A::hello(X $one, Y $two) in test.php on line 15
このようなエラーメッセージを表示します厳密にはGood Thing™です。しかし、同じことをコンストラクタ関数で試してみると、
class A
{
public function __construct(X $one, Y $two)
{
}
}
class B extends A
{
public function __construct()
{
}
}
PHPに問題はなく、プログラムが実行されます。
なぜ厳しい基準がコンストラクタに適用されないのかの歴史や技術的なコンテキストを知っている人はいますか? PHP Manualから
[マニュアル](http://php.net/manual/en/language.oop5.decon.php)で見つかった唯一のものは次のとおりです。*他のメソッドとは異なり、PHPはE_STRICTレベルのエラーを生成しません親の__construct()メソッドとは異なるパラメータで__construct()がオーバーライドされたときのメッセージ* – Rizier123
コンストラクタがオーバーロードされていないため、phpは気にしません。コンストラクターを使用しようとすると、新しいA()または新しいB()を使用してtheresが競合しないようにします。しかし、あなたがメソッドにアクセスしようとしている場合、phpは関数の名前と一致するだけなので呼び出すべきものを知りません –