为什么Magento有_construct和__construct方法?

Nic*_*ick 28 php design-patterns magento

Magento有一个_construct和一个__construct方法有原因吗?为什么附加_construct存在?通过_construct在子类中调用父构造函数来实现额外的方法可以实现任何目的吗?

ben*_*sch 68

我能找到的最佳答案:http://www.magentocommerce.com/boards/viewthread/76027/#t282659

基本上,根级别类(所有其他类继承的类)实现__construct,PHP在构造类时自动调用.现在,这个根级别的类只是调用_construct,它包含实际的代码.

说你有这个设置:

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
Run Code Online (Sandbox Code Playgroud)

PHP不会自动调用父类构造函数,因此doSomethingReallyImportant永远不会被调用.您可以要求子类构造函数调用parent::__construct(),但这很容易忘记.所以Magento有子类覆盖_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"
Run Code Online (Sandbox Code Playgroud)

PHP没有检测到构造函数SubClass,因此它调用了BaseClass构造函数.这使得BaseClassdoSomethingReallyImportant调用子类的重载之前_construct.