ใน Magento 2 คลาสส่วนใหญ่มีวิธีการสร้าง ( __construct
และ_construct
) ทั้งสองนี้ ความแตกต่างระหว่างพวกเขาคืออะไร?
ใน Magento 2 คลาสส่วนใหญ่มีวิธีการสร้าง ( __construct
และ_construct
) ทั้งสองนี้ ความแตกต่างระหว่างพวกเขาคืออะไร?
คำตอบ:
ฉันไม่แน่ใจว่ามันเปลี่ยนไประหว่างวีโอไอพี 1 และวีโอไอพี 2 หรือเปล่าบางทีฉันก็จะไปกับสิ่งที่ฉันรู้จากวีโอไอพี 1
_construct
จะถูกเรียกว่าหลังจากที่__construct
__construct
วิธีดั้งเดิมของ PHP ไม่ควรเขียนทับหรือใช้ในรหัสของคุณ _construct
หากคุณต้องการที่จะรันโค้ดในวิธีที่ปลอดภัยในการเริ่มต้นของการใช้งานในชั้นเรียน
วีโอไอพีจะใช้เนทีฟ__construct
เพื่อให้แน่ใจว่าทุกอย่าง 'พร้อม' สำหรับชั้นเรียนที่จะใช้เช่นการกำหนดแท็กแคชที่เหมาะสมสำหรับรุ่นบางรุ่น
_constructวิธีเป็น"Varien ประดิษฐ์"ใช้ในการห่อตรรกะเริ่มต้นบางอย่างในรูปแบบผู้ช่วยเหลือและบล็อก
ดังนั้นจึงเป็นเรื่องผิดปกติที่จะเปลี่ยนหรือประกาศวิธี__construct ()ดั้งเดิมใน M1 Models / Blocks หรือ Helpers เนื่องจากเรามักใช้โรงงานวีโอไอพี อย่างไรก็ตามไม่มีปัญหา / การปฏิบัติที่ไม่ดีเกี่ยวกับการใช้งาน (ถ้าคุณต้องการความเข้ากันได้)
ใน M2 เมธอด _construct ()ยังคงปรากฏอยู่ในบางส่วนและใช้เพื่อจุดประสงค์เดียวกัน แต่ตอนนี้ (ใน M2) ลอจิก DI ทั้งหมดถูกนำไปใช้โดย __constructor () ดังนั้นคุณจะพบการประกาศโครงสร้างจำนวนมากในฐานรหัส
BTW ไม่มีโรงงานอีกต่อไปMage::getModel()
ใน M2
ในคำอื่น ๆ :
_construct ()วิธีการดำเนินการโดยวีโอไอพีในบางชั้นเรียนและก็เรียกโดยอัตโนมัติภายใน__constructประกาศฟังก์ชันดังนั้นหากคุณกำลังขยายชั้นวีโอไอพีเช่นรุ่นคุณสามารถใช้มันในการดำเนินการสิ่งบางอย่างหลังจากการสร้างวัตถุ
ใน Resource Model หรือ Model Class คุณควรกำหนด_construct()
วิธีการเพื่อกำหนดตารางและ primary_key
ในอีกทางหนึ่ง__โครงสร้างเป็นวิธีดั้งเดิมของ PHP (ภาษา OO ทั้งหมดมีหนึ่งภาษา) __construct
ถูกเรียกใช้ทุกครั้งที่คุณสร้างอินสแตนซ์ของวัตถุ นั่นคือทั้งหมดที่
ตัวอย่าง:
วีโอไอพี \ Framework \ รุ่น \ 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();
} ...
วีโอไอพี \ Framework \ รุ่น \ 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();
}