Magento有一个_construct
和__construct
方法吗?为什么附加_construct
存在?通过调用子类中的父构造函数不能实现通过额外_construct
方法实现的任何事情?为什么Magento有_construct和__construct方法?
回答
最佳答案我可以找到: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
之前,这允许BaseClass
到doSomethingReallyImportant
。
这正是它存在的原因。作为一个Magento开发者,你绝不应该重载'__construct'方法,因为Magento中的所有东西都扩展了'Varien_Object'。 不知道为什么这还未被接受...... – JMTyler 2012-01-03 18:37:13
这不适用于所有类别。例如,观察者将不会自动调用_construct()方法。 – 2014-11-05 19:17:21
观察员是Magento中罕见的类,不应该(或至少不需要)扩展Varien/Mage类。如果你不扩展一个Varien类,那么调用_construct()的Varien行为不会发生。 – STW 2014-11-18 19:37:43
编辑:对不起,错过了_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();
}
}
马可:这是错误的覆盖__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";
}
}
- 1. _construct(方法)和__construct(保留的方法)在php
- 2. 为什么EAV资源和集合上的_construct()方法声明为抽象方法?
- 3. 为什么__construct方法在FOSUserBundle的User Entity中不起作用?
- 4. 笨重定向不会在_construct方法
- 5. 在phpunit中__construct和setup之间有什么区别?
- 6. PHP Mongo问题列表:当replicaSet为true时,_construct返回什么?
- 7. 算法和方法有什么区别
- 8. Magento为什么3个税收计算方法?
- 9. 有什么方法可以覆盖Magento中的Zend_Validate :: is()吗?
- 10. Magento中不同的* get helper *方法有什么区别?
- 11. 为什么C#没有为变量和方法设计'const'?
- 12. 为什么setter和getter方法
- 13. 为什么golang RGBA.RGBA()方法使用|和“?
- 14. 有没有什么方法可以使用'unset'作为方法?
- 15. 为什么java serversocket有setrecievebuffersize方法?
- 16. QGraphicsItem:为什么没有`stackAfter`方法?
- 17. 为什么gobject有install_properties方法?
- 18. 为什么XElement没有GetAttributeValue方法?
- 19. 为什么Object [ID]没有方法'Animate'?
- 20. 为什么Ruby没有is_an?方法?
- 21. 为什么我的`Runnable`有`start`方法?
- 22. 为什么NStepLSTM没有reset_state方法?
- 23. 为什么org.lwjgl.opengl.GL43类没有glDrawElements方法?
- 24. 为什么GLAutoDrawable没有方法addMouseListener将
- 25. 为什么ObservableCollection没有RemoveAll方法?
- 26. 为什么Object类有Thread方法?
- 27. 为什么SerializationInfo没有TryGetValue方法?
- 28. Mongoid为什么没有“事务”方法?
- 29. 为什么DataTable.Rows没有.Where()方法?
- 30. 为什么没有Array.IsNullOrEmpty()方法?
更多关于此? – lonesomeday 2012-01-02 23:29:03
几乎Magento中的每个类都扩展了'Varien_Object'类。这里定义了PHP'__construct',并定义了一个'_construct'。 – Nick 2012-01-02 23:46:51