2016-01-12 2 views
5

は、次のように無効なプログラムです"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から

+1

[マニュアル](http://php.net/manual/en/language.oop5.decon.php)で見つかった唯一のものは次のとおりです。*他のメソッドとは異なり、PHPはE_STRICTレベルのエラーを生成しません親の__construct()メソッドとは異なるパラメータで__construct()がオーバーライドされたときのメッセージ* – Rizier123

+2

コンストラクタがオーバーロードされていないため、phpは気にしません。コンストラクターを使用しようとすると、新しいA()または新しいB()を使用してtheresが競合しないようにします。しかし、あなたがメソッドにアクセスしようとしている場合、phpは関数の名前と一致するだけなので呼び出すべきものを知りません –

答えて

4

注:子クラスがコンストラクタを定義する場合は、親のコンストラクタが暗黙的に呼び出されていません。親コンストラクタを実行するには、子コンストラクタ内でparent :: __ construct()を呼び出す必要があります。子がコンストラクタを定義していない場合は、通常のクラスメソッドのように親クラスから継承することができます(プライベートとして宣言されていない場合)。

また:他の方法とは異なり

__construct()が親__construct()メソッドとは異なるパラメータで有するオーバーライドされた場合、PHPは、E_STRICTレベルのエラーメッセージを生成しないであろう。

継承の有用性は、すべての拡張クラスで同じコンストラクタ署名が必要だった場合、基本的に損なわれます。アプリケーションのすべてのコントローラに同じコンストラクタシグネチャが必要であると想像できますか?

関連する問題