为什么Magento有一个_construct和一个__construct方法?为什么会有额外的_construct?通过调用子类中的父类构造函数不能实现额外的_construct方法吗?
发布于 2012-01-03 07:35:01
我能找到的最佳答案: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 happenPHP不会自动调用父类构造函数,所以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没有检测到SubClass中的构造函数,所以它调用了BaseClass的构造函数,这允许BaseClass在调用子类的被覆盖的_construct之前进行doSomethingReallyImportant。
发布于 2013-12-05 14:18:26
对Marco说:在Magento中覆盖像这样的__construct()方法是错误的。原因是-所有类都从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上阅读更多关于这方面的内容
发布于 2012-01-04 06:27:25
编辑:对不起,在你的问题中错过了_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();
}
}https://stackoverflow.com/questions/8706352
复制相似问题