ตกลงการใช้สคริปต์การติดตั้งดูเหมือนจะเป็นเรื่องแปลกที่จะใช้สิ่งต่อไปนี้:
$installer = $this;
ฉันไม่เข้าใจจริงๆเพราะซ้ำซ้อนอย่างสมบูรณ์
ทำไมไม่ใช้เพียง$this->
ตลอดทั้งบท?
มีความคิดเห็นใดเกี่ยวกับสาเหตุของการประชุมนี้
ตกลงการใช้สคริปต์การติดตั้งดูเหมือนจะเป็นเรื่องแปลกที่จะใช้สิ่งต่อไปนี้:
$installer = $this;
ฉันไม่เข้าใจจริงๆเพราะซ้ำซ้อนอย่างสมบูรณ์
ทำไมไม่ใช้เพียง$this->
ตลอดทั้งบท?
มีความคิดเห็นใดเกี่ยวกับสาเหตุของการประชุมนี้
คำตอบ:
คำตอบนั้นง่ายกว่ามาก ในปี 2007 (และผมเชื่อว่าจนถึงปี 2009 เมื่อ PhpStorm เริ่มโยก) ไม่มีใครได้รับอนุญาตให้ IDE ให้ PHPDoc $this
อินไลน์สำหรับ แต่ผู้พัฒนาหลักต้องการให้มีการเติมข้อความอัตโนมัติใน IDE นั่นเป็นเหตุผลที่พวกเขาใช้ 2 บรรทัดเหล่านี้:
$installer = $this;
/* @var $installer <appropriate class> */
บางโมดูลมีคลาสการตั้งค่าของตัวเองและควรใช้ในอินไลน์ phpdoc แต่เนื่องจากการติดตั้ง / script อัพเกรดได้ (และ) ที่สร้างมักจะผ่าน "คัดลอก / วางบางอย่างที่มีอยู่และการเปลี่ยนแปลง" คุณสามารถหาบางทีตัวอย่างเมื่อโมดูลมีระดับการตั้งค่าของตัวเอง (หรือใช้ eav รูปแบบการติดตั้งMage_Eav_Model_Entity_Setup
) แต่Mage_Catalog_Model_Resource_Setup
จะใช้ใน PHPDoc อินไลน์ในการอัพเกรด ต้นฉบับ
รุ่นที่เก่าที่สุดที่ฉันมีคือ 1.0 แม้จะ$installer = $this;
มีอยู่แล้ว แม้ในไฟล์ชื่อupgrade-0.x.y-0.z.t
บรรทัดนี้ก็ยังมีอยู่
ในความคิดของฉันเมื่อพวกเขาเริ่มต้น (ฉันหมายถึงรุ่น 0.1 หรืออะไรทำนองนั้น) พวกเขามีบางอย่างที่เหมือนกัน$installer = new Something()
และพวกเขาตัดสินใจเปลี่ยนตรรกะ
ฉันคิดว่านี่เป็นเพราะ<class>
แท็กในconfig.xml
บางโมดูล (Mage_Catalog เป็นต้น) เวอร์ชันก่อน 1.6:
<setup>
<module>Mage_Catalog</module>
<class>Mage_Catalog_Model_Resource_Eav_Mysql4_Setup</class>
</setup>
หรือในเวอร์ชัน 1.6+:
<setup>
<module>Mage_Catalog</module>
<class>Mage_Catalog_Model_Resource_Setup</class>
</setup>
ฉันมักจะใช้$this
แทน$installer
และฉันไม่มีปัญหาใด ๆ (ถ้าเรื่องนั้นในทางใดทางหนึ่ง)
นี่คือการประชุมของตรรกะที่ไม่รู้จักและน่าสงสัยที่อาจเกิดขึ้นตั้งแต่เบต้าสาธารณะที่เก่าแก่ที่สุดจาก 2007 ( ดูตัวอย่าง B1 0.6.12383 ; จำเป็นต้องเข้าสู่ระบบ)
มันถูกใช้เป็นแบบแผนเพื่อให้แน่ใจว่าคลาสที่เรียกใช้งานรหัสการตั้งค่านั้นใช้นามแฝงอย่างสม่ำเสมอในสคริปต์การตั้งค่า ตัวอย่างเช่นในขณะที่ทั้งโมดูลEnterprise_GiftWrapping
และEnterprise_Rma
มีคลาสการตั้งค่าของตัวเองพวกเขาแต่ละนามแฝง$installer
ไปยังอินสแตนซ์ของMage_Catalog_Model_Resource_Setup
เมื่อมีการเพิ่มคุณสมบัติให้กับหน่วยงานผลิตภัณฑ์เช่น:
app / รหัส / หลัก / องค์กร / GiftWrapping / SQL / enterprise_giftwrapping_setup / ติดตั้ง 1.11.0.0.php
<?php
$installer = $this;
/* @var $installer Enterprise_GiftWrapping_Model_Resource_Setup */
//... miscellaneous Enterprise_GiftWrapping setup logic
$installer = Mage::getResourceModel('catalog/setup', 'catalog_setup');
//... miscellaneous product entity attribute manipulation
สิ่งหนึ่งที่ฉันชอบเกี่ยวกับการใช้$installer
ที่ฉันต้องการเพิ่มคือมันทำให้ง่ายต่อการแทนที่ด้วยสิ่งอื่นหรือเรียกใช้นอกขอบเขตของคลาส
1. การแทนที่:
$installer = $this;
/* @var $installer Mage_Core_Model_Resource_Setup */
// Do basic stuff
$installer = Mage::getSingleton('eav/entity_setup', 'eav_setup');
/* @var $installer Mage_Eav_Model_Entity_Setup */
/// Do stuff with attributes
2. ขอบเขตภายนอก:
$ php -a php> require_once 'app / Mage.php'; php> Mage :: init (); php> ต้องการ 'แอพ / รหัส / ท้องถิ่น / ผู้ขาย / โมดูล / ข้อมูล / vendormodule_setup / data-upgrade-0.1.1-0.1.2.php'; อัปเกรดทำงานแล้ว! แก้ไขข้อผิดพลาดการถ่ายโอนข้อมูล: อาร์เรย์ (4) { 'id' => int (123) 'foo' => สตริง (3) "บาร์" }
แน่นอนว่าdata-upgrade-0.1.1-0.1.2.php
ต้องมี:
//$installer = $this;
$installer = Mage::getResourceSingleton('core/setup', 'vendormodule_setup');
/* @var $installer Mage_Core_Model_Resource_Setup */
// Do lots of stuff ...
echo "Upgrade worked!\n";
echo "Debug data dump: ";
var_dump($debug);
ดังนั้นสิ่งนี้จะป้องกัน Fatal error: Using $this when not in object context
ฉันเดาว่ามันมาจากวันก่อนหน้า (<v.1.1) แต่เพื่อความซื่อสัตย์ฉันไม่มีความคิด ฉันคิดว่ามันอ่านได้ดีขึ้นเล็กน้อย ...
เราทำมาอย่างนี้มาตลอด
คุณรู้ ;-)