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