Php: Overriding abstract method goes wrong

Posted by Lu4 on Stack Overflow See other posts from Stack Overflow or by Lu4
Published on 2011-01-16T08:53:16Z Indexed on 2011/01/16 9:53 UTC
Read the original article Hit count: 327

Filed under:

Hi! I think there is a problem in php's OOP implementation.

EDIT: Consider more illustrative example:

abstract class Animal {

    public $name;

    // public function Communicate(Animal $partner) {}     // Works
    public abstract function Communicate(Animal $partner); // Gives error
}

class Panda extends Animal {

    public function Communicate(Panda $partner) {
        echo "Hi {$partner->name} I'm a Panda";
    }

}

class Human extends Animal {

    public function Communicate(Human $partner) {
        echo "Hi {$partner->name} I'm a Human";
    }

}

$john = new Human(); $john->name = 'John';
$mary = new Human(); $mary->name = 'Mary';
$john->Communicate($mary); // should be ok

$zuzi = new Panda(); $zuzi->name = 'Zuzi';
$zuzi->Communicate($john); // should give error

The problem is that when Animal::Communicate is an abstract method, php tells that the following methods are illegal:

"public function Communicate(Panda $partner)" "public function Communicate(Human $partner)"

but when Animal::Communicate is non-abstract but has zero-implementation Php thinks that these methods are legal. So in my opinion it's not right because we are doing override in both cases, and these both cases are equal, so it seems like it's a bug...

Older part of the post:

Please consider the following code:

Framework.php

namespace A
{
    class Component { ... }

    abstract class Decorator {
        public abstract function Decorate(\A\Component $component);
    }
}

Implementation.php

namespace B
{
    class MyComponent extends \A\Component { ... }
}

MyDecorator.php

namespace A
{
    class MyDecorator extends Decorator {
        public function Decorate(\B\MyComponent $component) { ... }
    }
}

The following code gives error in MyDecorator.php telling

Fatal error: Declaration of MyDecorator::Decorate() must be compatible with that of A\Decorator::Decorate() in MyDecorator.php on line ...

But when I change the Framework.php::Decorator class to the following implementation:

    abstract class Decorator {
        public function Decorate(\A\Component $component) {}
    }

the problem disappears.

© Stack Overflow or respective owner

Related posts about php