Answers:
该_construct方法是“瓦瑞恩发明”用来包裹在模型中,助手和块一些初始化逻辑。
由于我们始终使用Magento工厂,因此在M1模型/块或助手中更改或重新声明本机__construct()方法是不寻常的。但是使用它没有任何问题/不好的做法(如果您关心兼容性的话)。
在M2中,_construct()方法仍然存在于某些部分中,并用于相同的目的,但是现在(在M2中)所有DI逻辑都由__constructor()实现,因此您会在代码库中找到很多构造声明。
顺便说一句,没有像Mage::getModel()
M2 这样的工厂了。
换一种说法:
该_construct()方法是由Magento的一些类实现的,它会自动调用内部__construct函数声明,所以如果你喜欢扩展模型Magento的类,你可以用它创建对象后执行一些东西。
在资源模型或模型类中,应定义一个_construct()
方法以定义表和primary_key
另一方面,__construct是PHP 的本机方法(所有OO语言都有一个),__construct
每次实例化对象时都会调用__construct。就这样
例:
Magento \ Framework \ Model \ ResourceModel \ AbstractResource
/**
* Abstract resource model
*/
abstract class AbstractResource
{
/**
* Main constructor
*/
public function __construct()
{
/**
* Please override this one instead of overriding real __construct constructor
*/
$this->_construct();
} ...
Magento \ Framework \ Model \ ResourceModel \ Db \ AbstractDb
/**
* Class constructor
*
* @param \Magento\Framework\Model\ResourceModel\Db\Context $context
* @param string $connectionName
*/
public function __construct(\Magento\Framework\Model\ResourceModel\Db\Context $context, $connectionName = null)
{
$this->transactionManager = $context->getTransactionManager();
$this->_resources = $context->getResources();
$this->objectRelationProcessor = $context->getObjectRelationProcessor();
if ($connectionName !== null) {
$this->connectionName = $connectionName;
}
parent::__construct();
}