2016-10-25 10 views
0

PHPのヒント型には、その型のすべての派生物を含める必要があります。しかし、私は間違いをしています。私はこれを誤解しているのか、それとも間違っているのか不思議です。ここに私の簡単なテスト・ケースです:派生型を受け入れない型ヒント付きインターフェイスメソッド

<?php 

interface A { } 
interface A1 extends A { } // A1 is a specific type of A 

interface B { 
    function test(A $a); // B::test requires an object of type A 
} 

class ConcreteB implements B { 
    function test(A1 $a) { 
     echo "cha"; 
    } 
} 

?> 

このプログラムは、明らかに何もしませんが、それは問題を示すのに十分だ:私はそれを「実行」すると、PHPはFatal error: Declaration of ConcreteB::test(A1 $a) must be compatible with B::test(A $a)をスローします。あなたがA1上の任意のA関数を呼び出すことができるだろう、したがって、多型が保存されているのでAの種類をあるA1ので、

理論的には、2つの宣言は、互換性があると見られるべきです。

このエラーが表示される理由は何ですか?

答えて

0

ああ、私はあなたのインターフェイスが別の引数を必要としていることに気付きました。

最も優秀な答えを

Override method parameter with child interface as a new parameter

を参照してください。

+0

もちろんです。これがうまくいかない理由は、より明確に説明することができます。「ConcreteB」と「B」は、依存関係が関係している場合でも互換性を保つ必要があります。これがうまくいく間( 'B'が '' ConcreteB''でも使えると期待している全て)、それは落ちることはありません( '' ConcreteB''が '' B''でうまくいくとは思いません)。 これは実際には理想的だとはっきりしていませんが、明確に定義されたルールを持つことは価値があるので、私は文句を言うことはできません。 – kael

関連する問題