설치 스크립트에서 $ installer v $ this 사용


17

좋아, 설치 스크립트를 사용하면 다음을 사용하는 이상한 규칙이있는 것 같습니다.

$installer = $this;

완전히 중복되므로 이것을 이해하지 못합니다.

$this->스크립트 전체에서 사용하지 않습니까?

이 협약이 존재하는 이유에 대한 아이디어가 있습니까?


vscode에서 객체 컨텍스트 외부에서 사용되는 것에 대한 경고가 표시됩니다. 이 문제를 어떻게 해결할 수 있습니까?
헨리의 고양이

답변:


11

대답은 훨씬 간단합니다. 2007 년 (그리고 PhpStorm이 흔들기 시작한 2009 년까지는 믿습니다) 어느 IDE도 인라인 phpdoc을 제공 할 수 없었습니다 $this. 그러나 핵심 개발자는 IDE에서 자동 완성 기능을 원했습니다. 그래서이 두 줄을 사용했습니다.

$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(예 : Mag_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. 교체 :

$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> 마법사 :: init ();
php> 'app / code / local / Vendor / Module / data / vendormodule_setup / data-upgrade-0.1.1-0.1.2.php'가 필요합니다;
업그레이드가 성공했습니다!
디버그 데이터 덤프 : array (4) {
  'id'=>
  정수 (123)
  'foo'=>
  문자열 (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 = 마법사 :: getSingleton ( 'eav / entity_setup', 'eav_setup'); 기억해야합니다 ... 당신은 단지 Mage :: getResourceModel ( 'catalog / setup'...에 국한되지 않습니다 ...
CarComp

3

나는 그것이 이전 시대 (<v.1.1)에서 온 것 같아요. 그러나 솔직히 말해서, 나는 모른다. 나는 그것이 더 잘 읽을 수 있다고 생각합니다 ...

우린 항상 이렇게 했어

알다시피 ;-)


PHP OOP 코드에서는 그다지 의미가 없지만 처음에는 그것을 사용했습니다. 그런 다음 어느 시점에서 그 부분을 완전히 무시하고 아무런 문제가 없었습니다. 내 경험에 따르면이 코드를 안전하게 무시할 수 있습니다.
Petar Dzhambazov

그래, 나도 그렇게 생각해 난 그냥 익숙해 ...
Fabian Blechschmidt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.