Are abstract class constructors not implicitly called when a derived class is instantiated?

PhpAbstract Class

Php 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 */

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionscottmView Question on Stackoverflow
Solution 1 - PhpPascal MARTINView Answer on Stackoverflow
Solution 2 - PhpscottmView Answer on Stackoverflow
Solution 3 - PhpOtamayView Answer on Stackoverflow