Sử dụng trình cài đặt $ v $ này trong tập lệnh cài đặt


17

Ok, sử dụng các tập lệnh cài đặt dường như có một quy ước kỳ lạ để sử dụng như sau:

$installer = $this;

Tôi thực sự không hiểu điều này vì nó hoàn toàn dư thừa.

Tại sao không chỉ sử dụng $this->trong suốt kịch bản?

Bất kỳ ý tưởng về lý do tại sao quy ước này tồn tại?


Tôi nhận được cảnh báo về việc này được sử dụng bên ngoài bối cảnh đối tượng trong vscode. Bất cứ ý tưởng làm thế nào tôi sửa điều này?
Mèo của Henry

Câu trả lời:


11

Câu trả lời đơn giản hơn nhiều. Vào năm 2007 (và tôi tin cho đến năm 2009 khi PhpStorm bắt đầu rung chuyển) không một IDE nào được phép cung cấp phpdoc nội tuyến cho $this. Nhưng các nhà phát triển cốt lõi muốn có tự động hoàn thành trong IDE. Đó là lý do tại sao họ sử dụng 2 dòng này:

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

Một số mô-đun có lớp thiết lập riêng và nó nên được sử dụng trong phpdoc nội tuyến. Nhưng vì tập lệnh thiết lập / nâng cấp đã (và) luôn được tạo thông qua "sao chép / dán một số hiện có và thay đổi", bạn có thể tìm thấy các ví dụ khi mô-đun có lớp thiết lập riêng (hoặc sử dụng mô hình thiết lập eav Mage_Eav_Model_Entity_Setup) nhưng Mage_Catalog_Model_Resource_Setupđược sử dụng trong phpdoc nội tuyến trong nâng cấp kịch bản.


8

Phiên bản cũ nhất tôi có là 1.0. Ngay cả sau đó $installer = $this;tồn tại. Ngay cả trong các tập tin có tên upgrade-0.x.y-0.z.tdòng này tồn tại.

Theo tôi, khi họ bắt đầu (ý tôi là phiên bản 0.1 hoặc đại loại như thế) họ đã có một cái gì đó giống như vậy $installer = new Something()và họ quyết định thay đổi logic.
Tôi giả sử điều này là do <class>thẻ trong config.xmlmột số mô-đun (ví dụ Mage_Catalog). Các phiên bản trước 1.6:

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

Hoặc trong phiên bản 1.6+:

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

Tôi thường sử dụng $thisthay vì $installervà tôi không có vấn đề gì (nếu điều đó làm mờ đi bằng mọi cách).


5

Đây là một quy ước về logic chưa biết và có thể đáng ngờ hiện tại kể từ phiên bản beta công khai sớm nhất từ ​​năm 2007 ( Xem trước B1 0.6.12383 ; yêu cầu đăng nhập).

Nó được sử dụng như một quy ước để đảm bảo rằng lớp đang thực thi mã thiết lập luôn được đặt bí danh trong các tập lệnh thiết lập. Ví dụ, trong khi cả mô-đun Enterprise_GiftWrappingEnterprise_Rmamô-đun có các lớp thiết lập riêng, chúng đều có bí danh $installercho một thể hiện Mage_Catalog_Model_Resource_Setupkhi thêm thuộc tính vào thực thể sản phẩm, ví dụ:

ứng dụng / mã / lõi / Doanh nghiệp / 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

Một điều tôi thích khi sử dụng $installermà tôi thực sự muốn thêm là nó giúp dễ dàng thay thế nó bằng một thứ khác hoặc chạy nó bên ngoài phạm vi lớp.


1. Thay thế nó:

$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. Phạm vi bên ngoài:

$ php -a
php> allow_once 'app / Mage.php';
php> Pháp sư :: init ();
php> yêu cầu 'app / code / local / Vendor / Module / data / pursormodule_setup / data-nâng cấp-0.1.1-0.1.2.php';
Nâng cấp làm việc!
Kết xuất dữ liệu gỡ lỗi: mảng (4) {
  'id' =>
  int (123)
  'foo' =>
  chuỗi (3) "thanh"
}

Tất nhiên với data-upgrade-0.1.1-0.1.2.phpviệc có:

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

Vì vậy, điều này ngăn chặn Fatal error: Using $this when not in object context


$ Installer = Mage :: getSingleton ('eav / entity_setup', 'eav_setup'); rất quan trọng để nhớ ... Bạn không bị giới hạn chỉ với Mage :: getResourceModel ('catalog / setup' ...
CarComp

3

Tôi đoán nó là từ những ngày trước (<v.1.1). Nhưng thành thật mà nói, tôi không có ý tưởng. Tôi nghĩ rằng nó là một chút tốt hơn để đọc ...

Chúng tôi đã luôn luôn làm nó như thế này

Bạn biết ;-)


Tôi không nghĩ nó có ý nghĩa nhiều trong bất kỳ mã OOP PHP nào, nhưng ban đầu cũng sử dụng nó. Sau đó, tại một số điểm đã bỏ qua phần đó hoàn toàn, và không bao giờ có bất kỳ vấn đề. Vì vậy, kinh nghiệm của tôi là bạn có thể bỏ qua mã này một cách an toàn.
Petar Dzhambazov

Vâng, tôi cũng nghĩ vậy. Tôi chỉ quen với nó ...
Fabian Blechschmidt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.