PHPのマニュアルは言う:拡張実装は<a href="http://php.net/manual/en/language.oop5.interfaces.php" rel="nofollow">Object Interfaces</a>に
インタフェースで定義されているようにインターフェースを実装するクラスは、全く同じメソッドシグネチャを使用しなければなりません。そうしないと、致命的なエラーが発生します。
ありませんが、以下の場合を考える:私は持っているだけで、引数としてSpecialClass
を取る方法foo
、および具体的なクラス
class Bar
{
public function foo(BaseClass $object)
{
// do something with $object
}
}
が含まれているインタフェース
interface Foo
{
public function foo(SpecialClass $object);
}
を持っていますfoo
がBaseClass
(SpecialClass implements BaseClass
)の場合を除き、Foo
という同じ署名があります。
理論的には、Foo
インターフェイスを使用するコードが必要な場合はいつでも、Bar
のインスタンスを使用できます。すべてが動作するはずです(SpecialClassはBaseClassです)。換言すれば、Bar
は、というメソッドを持っており、SpecialClass
オブジェクトを処理できるため、Foo
で宣言されたコントラクトを満たしています。
私のコードでこれを明示的に使用するには、Bar implements Foo
と書くことができますが、ドキュメントに記載されているように致命的なエラーが発生します。
この致命的なエラーの原因は何ですか?このようなことが現時点で行われているのか、それともこのようなことを行う特別な理由があるのでしょうか?
それを指摘してくれてありがとう。私は2つのジェネリッククラスを使って質問を訂正しました – marcosh