インストールスクリプトでの$ installer v $ thisの使用


17

わかりました、インストールスクリプトを使用して、以下を使用する奇妙な規則があるようです:

$installer = $this;

これは完全に冗長であるため、私は本当に理解していません。

$this->スクリプト全体で使用しないのはなぜですか?

この規則が存在する理由に関するアイデアはありますか?


これがvscodeのオブジェクトコンテキスト外で使用されているという警告が表示されます。これをどのように修正するのですか?
ヘンリーの猫

回答:


11

答えははるかに簡単です。2007年(およびPhpStormが揺れ始めた2009年まで)、誰もIDEにインラインphpdocを提供できませんでした$this。しかし、コア開発者はIDEでオートコンプリートが必要でした。そのため、彼らはこれらの2行を使用しました。

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

一部のモジュールには独自のセットアップクラスがあり、インラインphpdocで使用する必要がありました。ただし、セットアップ/アップグレードスクリプトは常に「既存のものをコピーして貼り付けて変更する」ことで作成されているため、モジュールに独自のセットアップクラスがある(または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_GiftWrappingEnterprise_Rmaモジュールの両方に独自のセットアップクラス$installerがありますがMage_Catalog_Model_Resource_Setup、製品エンティティに属性を追加する場合のインスタンスのエイリアスはそれぞれ次のとおりです。

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

$installer私が本当に追加したい使用方法で気に入っていることの1つは、簡単に別のものに置き換えたり、クラススコープ外で実行したりできることです。


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> require 'app / code / local / Vendor / Module / data / vendormodule_setup / data-upgrade-0.1.1-0.1.2.php';
アップグレードが機能しました!
デバッグデータダンプ:array(4){
  'id' =>
  int(123)
  'foo' =>
  string(3) "bar"
}

もちろんです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( 'catalog / setup'だけに限定されません
...- CarComp

3

私はそれが初期(<v.1.1)からだと思います。しかし、正直に言うと、私にはわからない。私はそれが少し読みやすいと思います...

私たちはいつもこのようにしてきました

ええと ;-)


PHP OOPコードではあまり意味がないと思いますが、最初はそれを使用していました。その後、ある時点でその部分を完全に無視し、問題は発生しませんでした。したがって、私の経験では、このコードを安全に無視できます。
ペタルジャンバゾフ

うん、私もそう思う。私はちょうど...それに慣れて
ファビアンBlechschmidt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.