2012-01-02 105 views
27

Magento有一个_construct__construct方法吗?为什么附加_construct存在?通过调用子类中的父构造函数不能实现通过额外_construct方法实现的任何事情?为什么Magento有_construct和__construct方法?

+1

更多关于此? – lonesomeday 2012-01-02 23:29:03

+0

几乎Magento中的每个类都扩展了'Varien_Object'类。这里定义了PHP'__construct',并定义了一个'_construct'。 – Nick 2012-01-02 23:46:51

回答

63

最佳答案我可以找到: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 

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" 

PHP不​​检测构造函数,所以它调用BaseClass的构造。在调用SubClass的覆盖_construct之前,这允许BaseClassdoSomethingReallyImportant

+1

这正是它存在的原因。作为一个Magento开发者,你绝不应该重载'__construct'方法,因为Magento中的所有东西都扩展了'Varien_Object'。 不知道为什么这还未被接受...... – JMTyler 2012-01-03 18:37:13

+1

这不适用于所有类别。例如,观察者将不会自动调用_construct()方法。 – 2014-11-05 19:17:21

+0

观察员是Magento中罕见的类,不应该(或至少不需要)扩展Varien/Mage类。如果你不扩展一个Varien类,那么调用_construct()的Varien行为不会发生。 – STW 2014-11-18 19:37:43

3

编辑:对不起,错过了_construct__construct之间的区别在你的问题。我认为Magento程序员已经试图使覆盖构造函数更容易,而没有自己的构造函数不再被调用的风险。 Varien_Object上的_construct方法是空的,所以不从子类调用它并不重要。


这就是PHP如何实现类的构造函数和析构函数。没有任何Magento具体说明它。

在其他语言中,构造函数通常使用与该类本身具有相同名称的方法实现,构造函数通常在方法名称前带有一个波浪号(〜),该名称与该类名称相同。出于某种原因,PHP人员已经以这种方式实现了它,尽管PHP似乎也支持具有类名称的构造函数和析构函数(link)。

一个类不一定要有构造函数和/或析构函数,特别是当你继承另一个类的时候。如果你重写构造函数和析构函数,那么你需要手动调用它parent::调用重写类的构造函数和析构函数,如:

class SubClass extends BaseClass { 
    function __construct() { 
     parent::__construct(); 
     // Your code 
    } 
    function __destruct() { 
     // Your code 
     parent::__destruct(); 
    } 
} 
+0

这应该是正确的答案... – 2013-02-26 16:17:27

+1

编辑是非常重要的,太柔和了。我几乎低估了这个答案。 – kojiro 2013-05-02 23:34:33

+0

但有时候不要相信程序员的技能 – zie1ony 2014-03-14 15:08:26

4

马可:这是错误的覆盖__construct()方法是这样的Magento的。原因是 - 所有类别的Varien_Object继承它,它有这样的代码:使用你的代码

#File: lib/Varien/Object.php 
public function __construct() 
{  
     //...snip...    
     $args = func_get_args();  
     if (empty($args[0])) 
     {   
      $args[0] = array();  
     }  
     //...snip... 
} 
//... 

随着__construct,这些参数没有得到通过。 你真的要使用Benesch代码:你能不能给这样的一个例子

class SubClass extends BaseClass { 
    function _construct() { 
     print "In SubClass constructor\n"; 
    } 
} 

阅读Magento Block Lifecycle Methods by Alan Storm

相关问题