Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么Magento有u构造和u构造方法?_Php_Design Patterns_Magento - Fatal编程技术网

Php 为什么Magento有u构造和u构造方法?

Php 为什么Magento有u构造和u构造方法?,php,design-patterns,magento,Php,Design Patterns,Magento,Magento有\u构造和\u构造方法的原因是什么?为什么存在附加的\u结构?通过使用额外的\u construct方法可以实现的任何事情都不能通过在子类中调用父构造函数来实现吗?我能找到的最佳答案是: 基本上,根级别的类(所有其他类都从中继承)实现了\uu construct,每当构建一个类时,PHP都会自动调用该类。现在,这个根级别的类只调用\u construct,它包含实际的代码 假设您有以下设置: class BaseClass { function __construct()

Magento有
\u构造
\u构造
方法的原因是什么?为什么存在附加的
\u结构
?通过使用额外的
\u construct
方法可以实现的任何事情都不能通过在子类中调用父构造函数来实现吗?

我能找到的最佳答案是:

基本上,根级别的类(所有其他类都从中继承)实现了
\uu construct
,每当构建一个类时,PHP都会自动调用该类。现在,这个根级别的类只调用
\u 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不会自动调用父类构造函数,因此永远不会调用
dosomethingreallyiimportant
。您可以要求子类构造函数调用父类::\uu construct(),但这很容易忘记。所以Magento有子类覆盖
\u构造

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在
子类
中没有检测到构造函数,因此它调用
基类
的构造函数。这允许
基类
在调用子类的重写的
\u构造
编辑:对不起,在您的问题中错过了
\u构造
\u构造
之间的区别。我认为Magento程序员已经尝试使重写构造函数变得更容易,而不必冒着自己的构造函数不再被调用的风险。Varien_对象上的_构造方法为空,因此如果不是从子类调用它,则无所谓


这就是PHP实现类的构造函数和析构函数的方式。关于这件事,Magento没有什么特别的

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

一个类不必有构造函数和/或析构函数,特别是当您对另一个类进行子类化时。如果确实重写了构造函数或析构函数,则需要通过在
父项::
上手动调用被重写类的构造函数或析构函数,如:

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

对Marco来说:在Magento中这样重写
\u construct()
方法是错误的。原因是-所有类都从
Varien\u对象继承它,它有以下代码:

#File: lib/Varien/Object.php 
public function __construct() 
{     
      //...snip...             
      $args = func_get_args();     
      if (empty($args[0])) 
      {         
          $args[0] = array();     
      }     
      //...snip... 
} 
//... 
当_构造使用您的代码时,这些参数不会被传递。 您确实需要使用Benesch的代码:

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

请在

中阅读更多有关此的信息。您能举个例子吗?Magento中几乎每个类都扩展了
Varien_对象
类。这里定义了PHP
\u构造
,定义了
\u构造
,这正是它存在的原因。作为一名Magento开发人员,您永远不应该重写
\u构造
方法,因为Magento中的所有内容都扩展了
变量对象
。不知道为什么这还没有被接受…这不是所有的课程都适用的。例如,Observators不会自动调用_construct()方法。Observators是Magento中极少数不应该(或至少不需要)扩展Varien/Mage类的类。如果不扩展基础Varien类,则不会出现调用_construct()的Varien行为。编辑非常重要,而且过于简单。我几乎否决了这个答案。