Search code examples
phpdesign-patternsmagento

Why does Magento have _construct and __construct methods?


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?


Solution

  • 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.