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 回答