ใช้ $ installer v $ this ในสคริปต์การติดตั้ง


17

ตกลงการใช้สคริปต์การติดตั้งดูเหมือนจะเป็นเรื่องแปลกที่จะใช้สิ่งต่อไปนี้:

$installer = $this;

ฉันไม่เข้าใจจริงๆเพราะซ้ำซ้อนอย่างสมบูรณ์

ทำไมไม่ใช้เพียง$this->ตลอดทั้งบท?

มีความคิดเห็นใดเกี่ยวกับสาเหตุของการประชุมนี้


ฉันได้รับคำเตือนเกี่ยวกับสิ่งนี้ถูกใช้นอกบริบทวัตถุใน vscode ความคิดใดที่ฉันจะแก้ไขปัญหานี้?
แมวของเฮนรี่

คำตอบ:


11

คำตอบนั้นง่ายกว่ามาก ในปี 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 อินไลน์ในการอัพเกรด ต้นฉบับ


8

รุ่นที่เก่าที่สุดที่ฉันมีคือ 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และฉันไม่มีปัญหาใด ๆ (ถ้าเรื่องนั้นในทางใดทางหนึ่ง)


5

นี่คือการประชุมของตรรกะที่ไม่รู้จักและน่าสงสัยที่อาจเกิดขึ้นตั้งแต่เบต้าสาธารณะที่เก่าแก่ที่สุดจาก 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

4

สิ่งหนึ่งที่ฉันชอบเกี่ยวกับการใช้$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


$ installer = Mage :: getSingleton ('eav / entity_setup', 'eav_setup'); เป็นสิ่งสำคัญที่ต้องจำไว้ ... คุณไม่ จำกัด เพียง Mage :: getResourceModel ('แคตตาล็อก / การตั้งค่า' ...
CarComp

3

ฉันเดาว่ามันมาจากวันก่อนหน้า (<v.1.1) แต่เพื่อความซื่อสัตย์ฉันไม่มีความคิด ฉันคิดว่ามันอ่านได้ดีขึ้นเล็กน้อย ...

เราทำมาอย่างนี้มาตลอด

คุณรู้ ;-)


ฉันไม่คิดว่ามันสมเหตุสมผลกับโค้ด PHP OOP ใด ๆ แต่ใช้ในตอนแรกด้วย จากนั้นในบางจุดก็ไม่สนใจส่วนนั้นอย่างสมบูรณ์และไม่เคยมีปัญหาใด ๆ ดังนั้นประสบการณ์ของฉันคือคุณสามารถละเว้นรหัสนี้ได้อย่างปลอดภัย
Petar Dzhambazov

ใช่ฉันก็คิดเช่นกัน ฉันเพิ่ง
ชิน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.