Muc Muc - 10 days ago 5
PHP Question

Php type hinting not getting along with interfaces and abstract classes?

I think it'll be much easier to see the problem in a code example than writing the question in the first place. Here is my php code:

<?php

interface AnInterface
{
public function method();
}

class AClass implements AnInterface
{
public function method()
{
echo __METHOD__;
}
}

abstract class AnAbstractClass
{
abstract public function method( AnInterface $Object );
}

class ConcreteClass extends AnAbstractClass
{
public function method( AClass $Object )
{
$Object->method();
}
}

$Object1 = new ConcreteClass();
$Object2 = new AClass();

$Object1->method( $Object2 );


The above code causes the following error:


Fatal error: Declaration of ConcreteClass::method() must be compatible with that of AnAbstractClass::method()


The problem is that php doesn't seem to be recognizing the signatures of AnAbstractClass::method and ConcreteClass::method as compatible. Am I doing something wrong? Thanks!

Answer

php doesn't seem to be recognizing the signatures of AnAbstractClass::method and ConcreteClass::method as compatible.

PHP is correct, they're not compatible. By allowing only instances of AClass (or its children) to be passed to ConcreteClass::method, you're breaking the contract that AnAbstractClass provides: Any of its subclasses must accept AnInterface as an argument to its method().

If your example worked, and I had another class BClass implementing AnInterface, we'd have a situation where according to AnAbstractClass, method() should accept instances of BClass, while according to ConcreteClass, it shouldn't.

Change your signature for ConcreteClass::method to match that of AnAbstractClass::method.

Comments