2

そのようなコード:

interface entite
{

}

class Foo implements entite
{

}


$foo = new foo;
if( $foo instanceof entite ) echo "he is";

「彼は」を表示します。Fooはインターフェースから「entite」タイプを継承しますが、それを試してみると:

class FooDeleter implements deleter
{
public function __construct(Foo $Foo)
{

}
}

interface deleter
{
public function __construct(entite $entite);
}

私に与える:

Fatal error: Declaration of FooDeleter::__construct() must be compatible with deleter::__construct(entite $entite)

なんで ?方法 ?=(

編集:ユニークな方法は、実際には次のように型付き削除機能を定義することです:

class FooDeleter implements deleter
{
public function __construct(entite $Foo)
{
    if( $Foo instanceof Foo ) { ... }       
}
}
4

2 に答える 2

2

FooDeleterインターフェイスよりも厳密な型ヒントを使用してコンストラクターを 宣言すると、インターフェイスに違反することになります。

コンストラクターをに変更した場合

public function __construct(entite $Foo)

...その後もオブジェクトを渡すことができFoo、インターフェイスは正しく実装されます。

于 2013-03-05T03:14:43.147 に答える
1

PHPドキュメントによると:

インターフェイスを実装するクラスは、インターフェイスで定義されているものとまったく同じメソッドシグネチャを使用する必要があります。そうしないと、致命的なエラーが発生します。

関数名と引数番号、および引数タイプ(指定されている場合)はメソッドシグネチャの一部(すべて?)であるため、まったく同じメソッドを宣言する必要があります。

引き続き使用できますnew FooDeleter($foo)

于 2013-03-05T03:15:39.490 に答える