2013-01-21 28 views
5

tôi đã được sử dụng Magento một thời bây giờ và luôn luôn không thể quyết định giữa việc sử dụng getter kỳ diệu và getData()Magento, thu khí kỳ diệu v getData

Ai đó có thể giải thích sự khác biệt chính, ngoài các chi phí hoạt động nhẹ (và nó phải rất nhẹ).

Tôi đang nghĩ về:

  1. đang Future bằng chứng (tôi nghĩ rằng Magento 2 sẽ không được sử dụng getter ma thuật)
  2. Phong cách
  3. Performance
  4. ổn định
  5. Bất kỳ lý do khác để sử dụng 1 trên số khác

Không có cách rõ ràng để đi dựa trên mã lõi vì nó sử dụng hỗn hợp của cả hai

+0

"tôi nghĩ rằng Magento 2 sẽ không sử dụng ma thuật getter "? – benmarks

+0

@benmarks Tôi đọc rằng một vài lần, quá. Hãy tìm ví dụ ở đây: http://dimitrigatowski.com/tag/magento-2/ "Trong Magento 2 sẽ không có bất kỳ getters và setters ma thuật" – mpaepper

+0

@mpaepper Vâng, và bài viết đó có đầy đủ các lỗi không chính xác lỗi thời tương tự (ví dụ: cú pháp 'createObject()', được thực hiện sau đó được gỡ bỏ), tôi sợ. Tôi tin rằng quá trình nạp chồng '__call()' biến mất khi tôi [xem @method hinting remove: -)] (https://github.com/magento/magento2/blob/master/app/code/core/Mage/ Bán hàng/Model/Order.php) – benmarks

Trả lời

3

Theo tôi, cách an toàn nhất là luôn sử dụng getData($key). Bộ lấy ma thuật sử dụng cùng phương pháp như bạn đã chỉ ra. Lợi thế là bạn có thể tìm tất cả các tham chiếu đến getData trong mã của bạn và thay đổi nó một cách thích hợp trong trường hợp phương pháp getData() được cấu trúc lại. So sánh điều đó với việc phải tìm ra tất cả các cuộc gọi phương pháp kỳ diệu, nơi chúng luôn được đặt tên khác nhau. Điều thứ hai là phép thuật getter có thể vặn bạn dễ dàng khi bạn có một phương pháp được đặt tên theo cùng một cách (tôi nghĩ getName() đã cho tôi một lần và phải mất một thời gian để gỡ lỗi). Vì vậy, phiếu bầu của tôi chắc chắn là sử dụng getData().

+0

Một lý do khác: Sử dụng getData() là rõ ràng về phương pháp nào được sử dụng, vì vậy mọi người mới sử dụng Magento có thể xác định những gì đang xảy ra. Ngược lại với phép thuật getter như một người mới, bạn cần phải tìm ra những gì đang xảy ra với các phương pháp ma thuật. – mpaepper

9

Không có câu trả lời nào để phù hợp với mọi tình huống và tốt nhất là nên quyết định dựa trên mô hình bạn đang sử dụng và trường hợp sử dụng cụ thể.

Hiệu suất là khá kém đối với các phương pháp ma thuật, cũng như chi phí bổ sung khi chuyển đổi từ CamelCase xuống dưới_score trên mỗi người truy cập.

phương pháp ma thuật về cơ bản là trình bao bọc cho getData(), với chi phí bổ sung.

Có là một trong những lợi thế của việc sử dụng phương pháp kỳ diệu dù, ví dụ:

nếu bạn sử dụng getAttributeName() chứ không phải là getData ('ATTRIBUTE_NAME')

tại một số điểm trong tương lai, mô hình có thể được cập nhật để bao gồm phương thức getAttributeName() thực, cụ thể, trong trường hợp đó mã của bạn sẽ vẫn hoạt động tốt. Tuy nhiên nếu bạn đã sử dụng getData(), bạn truy cập trực tiếp thuộc tính và bỏ qua phương thức mới, có thể bao gồm một số tính toán quan trọng mà bạn đang bỏ qua.

0

Như đã nêu trước đây, tốt nhất bạn nên sử dụng getData qua các phương pháp ma thuật. Chỉ muốn thêm 2 điểm nhanh:

1) Chi phí thực hiện không phải là nhỏ, đặc biệt là do việc triển khai _underscore trong Varien_Object (như đã đề cập bởi Andrew).

2) Việc triển khai getData có một số logic giúp "giả vờ" mã, và mặc dù nó là ít hơn chậm hơn so với cuộc gọi getData điển hình, vẫn nhanh hơn nhiều so với các phương pháp ma thuật.

Nếu bạn đã lồng Varien_Object 's để bạn cần phải thực hiện một cuộc gọi như:

$firstObject->getData('second_object')->getData('third_object')->getData('some_string'); 

bạn cũng có thể thực hiện cuộc gọi đó như thế này:

$firstObject->getData('second_object/third_object/some_string'); 
Các vấn đề liên quan