Is there a reason why Magento has a _construct and a __construct method? Why does the additional _construct exist? Could anything achieved by having the extra _construct method not be achieved by just calling the parent constructor in the child class?
PHP - The __construct Function A constructor allows you to initialize an object's properties upon creation of the object. If you create a __construct() function, PHP will automatically call this function when you create an object from a class.
__construct() is the method name for the constructor. The constructor is called on an object after it has been created, and is a good place to put initialisation code, etc.
Best answer I can find: http://www.magentocommerce.com/boards/viewthread/76027/#t282659
Basically, the root-level class (from which all other classes inherit) implements __construct, which PHP calls automatically whenever a class is constructed. Right now, this root-level class simply calls _construct, which contains the actual code.
Say you have this set-up:
class BaseClass { function __construct() { print "In BaseClass constructor\n"; doSomethingReallyImportant(); } } class SubClass extends BaseClass { function __construct() { print "In SubClass constructor\n"; } } $obj = new BaseClass(); //"In BaseClass constructor" //something really important happens $obj = new SubClass(); //"In SubClass constructor" //important thing DOESN'T happen PHP doesn't automatically call the parent class constructors, so doSomethingReallyImportant never gets called. You could require that subclass constructors call parent::__construct(), but that's easy to forget. So Magento has subclasses override _construct:
class BaseClass { function __construct() { doSomethingReallyImportant(); _construct(); } function _construct() { print "In BaseClass constructor\n"; } } class SubClass extends BaseClass { function _construct() { print "In SubClass constructor\n"; } } $obj = new BaseClass(); //something really important happens //"In BaseClass constructor" $obj = new SubClass(); //something really important happens //"In SubClass constructor" PHP doesn't detect a constructor in SubClass, so it calls BaseClass's constructor. This allows BaseClass to doSomethingReallyImportant before calling SubClass's overridden _construct.
To Marco: it is wrong to override __construct() method like this in Magento. The reason is - all classes inherit it from Varien_Object and it has this code:
#File: lib/Varien/Object.php public function __construct() { //...snip... $args = func_get_args(); if (empty($args[0])) { $args[0] = array(); } //...snip... } //... With the __construct using your code, those arguments don’t get passed through. You really have to use Benesch's code:
class SubClass extends BaseClass { function _construct() { print "In SubClass constructor\n"; } } Read more about this in Magento Block Lifecycle Methods by Alan Storm
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