43

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.
  • 32,471
  • 48
  • 110
  • 179

3 Answers3

45

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
  • 98,321
  • 23
  • 206
  • 194
  • 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
  • 17,199
  • 8
  • 49
  • 58