A code like that :
interface entite
{
}
class Foo implements entite
{
}
$foo = new foo;
if( $foo instanceof entite ) echo "he is";
Displays "he is". Foo inherit type "entite" from the interface But when try that :
class FooDeleter implements deleter
{
public function __construct(Foo $Foo)
{
}
}
interface deleter
{
public function __construct(entite $entite);
}
Gives me :
Fatal error: Declaration of FooDeleter::__construct() must be compatible with deleter::__construct(entite $entite)
Why ? How to ? =(
Edit : The unique way is actually define the typed deleter like that :
class FooDeleter implements deleter
{
public function __construct(entite $Foo)
{
if( $Foo instanceof Foo ) { ... }
}
}
By declaring your FooDeleter
constructor with a type hint that is more strict than the interface, you are violating the interface.
If you changed your constructor to
public function __construct(entite $Foo)
...then you could still pass in a Foo
object, and the interface would be implemented correctly.
According to PHP Document:
Note:
The class implementing the interface must use the exact same method signatures as are defined in the interface. Not doing so will result in a fatal error.
Function name and argument numbers and argument type (if specified) are part (all?) of the method signature, so you'll have to declare an exact same method.
You can still use new FooDeleter($foo)
.