Are abstract class constructors not implicitly called when a derived class is instantiated?
PhpAbstract ClassPhp Problem Overview
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
Php Solutions
Solution 1 - Php
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 to
> parent::__construct()
within the
> child constructor is required.
Solution 2 - Php
Well, I just found this in the docs:
> Note: Parent constructors are not > called implicitly if the child class > defines a constructor. In order to run > a parent constructor, a call to > parent::__construct() within the child > constructor is required.
Solution 3 - Php
If you need the same behaviour as C#, that is the parent constructor gets always executed before child constructor, you could create a fake constructor class for your child classes and declare it as an abstract function in your abstract parent class.
E.g.
abstract class Test{
abstract public function __childconstruct();
public function __construct(){
echo "SOME CODE".PHP_EOL;
$this->__childconstruct();
}
}
class TestExtended extends Test{
public function __childconstruct(){
echo "SOME OTHER CODE FROM EXTENDED CLASS".PHP_EOL;
}
}
$a = new TestExtended();
/* SOME CODE
SOME OTHER CODE FROM EXTENDED CLASS */