首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Magento有_construct和__construct方法?

为什么Magento有_construct和__construct方法?
EN

Stack Overflow用户
提问于 2012-01-03 07:22:55
回答 3查看 18.8K关注 0票数 28

为什么Magento有一个_construct和一个__construct方法?为什么会有额外的_construct?通过调用子类中的父类构造函数不能实现额外的_construct方法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-03 07:35:01

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

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

假设你有这样的设置:

代码语言:javascript
复制
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的子类

代码语言:javascript
复制
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没有检测到SubClass中的构造函数,所以它调用了BaseClass的构造函数,这允许BaseClass在调用子类的被覆盖的_construct之前进行doSomethingReallyImportant

票数 69
EN

Stack Overflow用户

发布于 2013-12-05 14:18:26

对Marco说:在Magento中覆盖像这样的__construct()方法是错误的。原因是-所有类都从Varien_Object继承它,并且它具有以下代码:

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

在__construct使用您的代码时,这些参数不会被传递。你真的必须使用Benesch的代码:

代码语言:javascript
复制
class SubClass extends BaseClass {
   function _construct() {
       print "In SubClass constructor\n";
   }
}

Magento Block Lifecycle Methods by Alan Storm上阅读更多关于这方面的内容

票数 4
EN

Stack Overflow用户

发布于 2012-01-04 06:27:25

编辑:对不起,在你的问题中错过了_construct__construct之间的区别。我认为Magento程序员试图让重写构造函数变得更容易,而不会有自己的构造函数不再被调用的风险。Varien_Object上的_construct方法是空的,所以即使它不是从子类中调用的,也没有关系。

这正是PHP实现类的构造函数和析构函数的方式。这并不是Magento所说的。

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

一个类不一定要有构造函数和/或析构函数,特别是当你继承另一个类的子类时。如果您确实覆盖了构造函数或析构函数,则需要通过在parent::上调用它来手动调用被覆盖类的构造函数或析构函数,例如:

代码语言:javascript
复制
class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();
       // Your code
   }
   function __destruct() {
       // Your code
       parent::__destruct();
   }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8706352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档