Penggunaan $ installer v $ this dalam skrip instal


17

Oke, menggunakan skrip instal tampaknya ada konvensi aneh untuk menggunakan berikut ini:

$installer = $this;

Saya benar-benar tidak mengerti ini karena benar-benar berlebihan.

Mengapa tidak menggunakan $this->seluruh skrip saja?

Adakah ide mengapa konvensi ini ada?


Saya mendapat peringatan tentang ini sedang digunakan di luar konteks objek dalam vscode. Ada yang tahu bagaimana saya memperbaikinya?
Kucing Henry

Jawaban:


11

Jawabannya jauh lebih sederhana. Pada 2007 (dan saya yakin sampai 2009 ketika PhpStorm mulai goyang) tidak ada satu pun IDE yang diizinkan untuk menyediakan phpdoc sebaris untuk $this. Tetapi pengembang inti ingin memiliki pelengkapan otomatis dalam IDE. Itu sebabnya mereka menggunakan 2 baris ini:

$installer = $this;
/* @var $installer <appropriate class> */

Beberapa modul memiliki kelas pengaturan sendiri dan seharusnya sudah digunakan di phpdoc inline. Tetapi karena skrip setup / upgrade selalu dibuat melalui "copy / paste beberapa yang sudah ada dan ubah" Anda dapat menemukan contoh-contoh ketika modul memiliki kelas setup sendiri (atau menggunakan model setup EAV Mage_Eav_Model_Entity_Setup) tetapi Mage_Catalog_Model_Resource_Setupdigunakan dalam phpdoc inline dalam upgrade naskah.


8

Versi tertua yang saya miliki adalah 1.0. Bahkan kemudian $installer = $this;ada. Bahkan dalam file bernama upgrade-0.x.y-0.z.tbaris ini ada.

Menurut pendapat saya, ketika mereka mulai (maksud saya versi 0.1 atau sesuatu seperti itu) mereka memiliki sesuatu seperti $installer = new Something()dan mereka memutuskan untuk mengubah logika.
Saya menganggap ini karena <class>tag pada config.xmlbeberapa modul (Mage_Catalog misalnya). Versi sebelum 1.6:

<setup>
    <module>Mage_Catalog</module>
    <class>Mage_Catalog_Model_Resource_Eav_Mysql4_Setup</class>
</setup> 

Atau dalam versi 1.6+:

<setup>
    <module>Mage_Catalog</module>
    <class>Mage_Catalog_Model_Resource_Setup</class>
</setup>

Saya biasanya menggunakan $thisbukan $installerdan saya tidak punya masalah (jika itu masalah dengan cara apa pun).


5

Ini adalah konvensi dari logika yang tidak diketahui dan mungkin meragukan yang hadir sejak beta publik paling awal dari tahun 2007 ( Pratinjau B1 0.6.12383 ; diperlukan login).

Ini digunakan sebagai konvensi untuk memastikan bahwa kelas yang menjalankan kode pengaturan secara konsisten alias dalam skrip pengaturan. Sebagai contoh, walaupun kedua modul Enterprise_GiftWrappingdan Enterprise_Rmamemiliki kelas pengaturan sendiri, masing-masing alias $installerke instance Mage_Catalog_Model_Resource_Setupketika menambahkan atribut ke entitas produk, misalnya:

app / code / core / Enterprise / GiftWrapping / sql / enterprise_giftwrapping_setup / install-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

Satu hal yang saya sukai tentang penggunaan $installeryang benar-benar ingin saya tambahkan adalah membuatnya mudah untuk menggantinya dengan sesuatu yang lain atau menjalankannya di luar lingkup kelas.


1. Menggantinya:

$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. Lingkup luar:

$ php -a
php> require_once 'app / Mage.php';
php> Mage :: init ();
php> memerlukan 'app / code / local / Vendor / Module / data / vendormodule_setup / data-upgrade-0.1.1-0.1.2.php';
Pembaruan berhasil!
Debug data dump: array (4) {
  'id' =>
  int (123)
  'foo' =>
  string (3) "bar"
}

Tentu saja dengan data-upgrade-0.1.1-0.1.2.phpmemiliki:

//$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);

Jadi ini mencegah Fatal error: Using $this when not in object context


$ installer = Mage :: getSingleton ('eav / entity_setup', 'eav_setup'); penting untuk diingat ... Anda tidak terbatas hanya pada Mage :: getResourceModel ('catalog / setup' ...
CarComp

3

Saya kira itu dari hari-hari sebelumnya (<v.1.1). Tapi jujur ​​saja, saya tidak tahu. Saya pikir ini sedikit lebih baik dibaca ...

Kami selalu melakukannya seperti ini

Kamu tahu ;-)


Saya tidak berpikir itu masuk akal dalam kode PHP OOP, tetapi menggunakannya pada awalnya juga. Kemudian pada suatu titik mengabaikan bagian itu sepenuhnya, dan tidak pernah memiliki masalah. Jadi pengalaman saya adalah Anda dapat dengan aman mengabaikan kode ini.
Petar Dzhambazov

Ya, saya juga berpikir begitu. Saya hanya terbiasa dengan itu ...
Fabian Blechschmidt
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.