2

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 ) { ... }       
}
}
5
  • 4
    Hoping you mean "OOP Interface"? Commented Mar 5, 2013 at 1:53
  • 1
    This is example code from the Big Brown Book of PHP. Commented Mar 5, 2013 at 2:03
  • 2
    I'm very surprised PHP lets you define a constructor in an interface. Seems like a terrible idea to me. Related question here - stackoverflow.com/questions/783046/… Commented Mar 5, 2013 at 3:12
  • @Phil it surely does seem like a non-useful feature. Commented Mar 5, 2013 at 3:17
  • A ctor is an implementation detail and should not go into the interface. Commented Mar 6, 2013 at 9:19

2 Answers 2

2

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.

Sign up to request clarification or add additional context in comments.

Comments

1

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).

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.