L'utilizzo di $ dell'installatore V $ questo script di installazione
-
16-10-2019 - |
Domanda
Ok, usando gli script di installazione sembra che ci sia una convenzione strano per utilizzare il seguente:
$installer = $this;
Io davvero non capisco questo in quanto è del tutto superfluo.
Perché non basta usare $this->
tutto lo script?
Tutte le idee sul perché esiste questa convenzione?
Soluzione
La risposta è molto più semplice. Nel 2007 (e credo che fino al 2009, quando ha iniziato a dondolo PhpStorm) nessuno IDE permesso di fornire phpdoc linea per $this
. Ma gli sviluppatori di base voluto avere il completamento automatico in IDE. È per questo che hanno usato queste 2 linee:
$installer = $this;
/* @var $installer <appropriate class> */
Alcuni moduli hanno proprio classe di installazione e dovrebbe sono stati utilizzati in PHPDoc linea. Ma poiché l'installazione script / aggiornamento erano (e sono) sempre creato tramite "copia / incolla qualche esistente e cambiamento" si possono trovare forse esempi in cui modulo è dotato di propria classe di installazione (o usi EAV modello di impostazione Mage_Eav_Model_Entity_Setup
), ma Mage_Catalog_Model_Resource_Setup
è utilizzato in PHPDoc inline in script di aggiornamento.
Altri suggerimenti
La versione più vecchia che ho è 1.0. Anche allora $installer = $this;
esistito. Anche nelle file denominati upgrade-0.x.y-0.z.t
esiste questa linea.
A mio parere, quando hanno iniziato (intendo la versione 0.1 o qualcosa di simile) avessero qualcosa come $installer = new Something()
e hanno deciso di cambiare la logica.
Presumo perché del tag <class>
nella config.xml
di alcuni moduli (Mage_Catalog per esempio).
Versioni precedenti 1.6:
<setup>
<module>Mage_Catalog</module>
<class>Mage_Catalog_Model_Resource_Eav_Mysql4_Setup</class>
</setup>
o nelle versioni 1.6 e versioni successive:
<setup>
<module>Mage_Catalog</module>
<class>Mage_Catalog_Model_Resource_Setup</class>
</setup>
Io di solito utilizzare $this
invece di $installer
e non ho avuto alcun problema (se maters in alcun modo).
Questa è una convenzione di ignoto e logico presente possibilmente discutibile dal momento che la prima beta pubblica a partire dal 2007 ( Anteprima B1 0.6.12383 ; login richiesto)
. E 'usato come una convenzione per garantire che la classe che sta eseguendo codice di impostazione è costantemente alias negli script di configurazione. Ad esempio, mentre entrambi i moduli Enterprise_GiftWrapping
e Enterprise_Rma
hanno le loro classi di installazione, ognuno $installer
alias a un'istanza di Mage_Catalog_Model_Resource_Setup
quando si aggiunge attributi per l'entità del prodotto, per esempio:.
app / code / core / Enterprise / Chiudere pacchetti regalo / 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
Una cosa che mi piace di utilizzare $installer
che voglio davvero aggiungere è che essa rende facile sostituirlo con qualcos'altro o per eseguirlo al di fuori del campo di applicazione della classe.
1. Sostituendola:
$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. ambito esterno:
$ php -a php > require_once 'app/Mage.php'; php > Mage::init(); php > require 'app/code/local/Vendor/Module/data/vendormodule_setup/data-upgrade-0.1.1-0.1.2.php'; Upgrade worked! Debug data dump: array(4) { 'id' => int(123) 'foo' => string(3) "bar" }
Naturalmente con data-upgrade-0.1.1-0.1.2.php
avere:
//$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);
Quindi questo impedisce Fatal error: Using $this when not in object context
Direi che è da giorni precedenti ( abbiamo sempre fatto in questo modo Non si sa; -)