42

Is it possible in PHP, that an abstract class inherits from an abstract class?

For example,

abstract class Generic {
    abstract public function a();
    abstract public function b();
}

abstract class MoreConcrete extends Generic {
    public function a() { do_stuff(); }
    abstract public function b(); // I want this not to be implemented here...
}

class VeryConcrete extends MoreConcrete {
    public function b() { do_stuff(); }

}

( abstract class extends abstract class in php? does not give an answer)

Community
  • 1
  • 1
Jakub M.
  • 30,095
  • 43
  • 103
  • 169

3 Answers3

42

Yes, this is possible.

If a subclass does not implements all abstract methods of the abstract superclass, it must be abstract too.

Arnaud Le Blanc
  • 95,062
  • 22
  • 198
  • 192
  • 2
    without `abstract public function b();` in the second class it works... answered, thanks – Jakub M. Sep 01 '11 at 11:37
  • Note that the order of the definitions matters. If you put the class VeryConcrete first, you will get 'Fatal error: Class 'MoreConcrete' not found' error. Be careful not to put the abstract cart before the horse. – RightHandedMonkey Sep 11 '14 at 15:31
6

It will work, even if you leave the abstract function b(); in class MoreConcrete.

But in this specific example I would transform class "Generic" into an Interface, as it has no more implementation beside the method definitions.

interface Generic {
    public function a(); 
    public function b();
}

abstract class MoreConcrete implements Generic {
    public function a() { do_stuff(); }
    // can be left out, as the class is defined abstract
    // abstract public function b();
}

class VeryConcrete extends MoreConcrete {
    // this class has to implement the method b() as it is not abstract.
    public function b() { do_stuff(); }
}
user2806167
  • 61
  • 1
  • 1
5

Yes it is possible however your code would not work if you called $VeryConcreteObject->b()

Here is more detailed explanation.

matino
  • 16,442
  • 7
  • 46
  • 56