Take this example:
abstract class Base { function __construct() { echo 'Base __construct<br/>'; } } class Child extends Base { function __construct() { echo 'Child __construct<br/>'; } } $c = new Child();
Coming from a C# background, I expect the output to be
Base __construct
Child __construct
However, the actual output is just
Child __construct
1) Abstract classes have constructors and those constructors are always invoked when a concrete subclass is instantiated. We know that when we are going to instantiate a class, we always use constructor of that class. Now every constructor invokes the constructor of its super class with an implicit call to super() .
Like any other classes in Java, abstract classes can have constructors even when they are only called from their concrete subclasses.
Constructor is always called by its class name in a class itself. A constructor is used to initialize an object not to build the object. As we all know abstract classes also do have a constructor.
Yes, an abstract class can have a constructor, even though an abstract class cannot be instantiated.
No, the constructor of the parent class is not called if the child class defines a constructor.
From the constructor of your child class, you have to call the constructor of the parent's class :
parent::__construct();
Passing it parameters, if needed.
Generally, you'll do so at the beginning of the constructor of the child class, before any specific code ; which means, in your case, you'd have :
class Child extends Base { function __construct() { parent::__construct(); echo 'Child __construct<br/>'; } }
And, for reference, you can take a look at this page of the PHP manual : Constructors and Destructors -- it states (quoting) :
Note: Parent constructors are not called implicitly if the child class defines a constructor.
In order to run a parent constructor, a call toparent::__construct()
within the child constructor is required.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With