2013-01-21 13 views
5

Używam Magento na chwilę teraz i zawsze nie mogę się zdecydować między używaniem magiczną getter i getData()Magento, magiczne getters przeciwko getData

Może ktoś wyjaśnić główne różnice, oprócz niewielkiego narzutu wydajności (i musi być bardzo nieznaczne).

myślę w kategoriach:

  1. Kod Future dowód (myślę Magento 2 nie będzie używał magicznego getter)
  2. stylistycznie
  3. Wydajność
  4. Stabilność
  5. Wszelkie inne powody, aby Za pomocą przycisków 1 nad innymi

nie ma jasny sposób, aby przejść na podstawie kodu rdzenia, ponieważ wykorzystuje mieszankę zarówno

+0

„Myślę magento 2 nie będzie używać magicznego gettera "? – benmarks

+0

@benmarks Czytam to kilka razy. Spójrzmy na przykład tutaj: http://dimitrigatowski.com/tag/magento-2/ "W Magento 2 nie będzie żadnych magicznych pobierających i ustawiających" – mpaepper

+0

@mpaepper Tak, a ten wpis jest pełen podobnych nieaktualnych nieścisłości, a także (np. 'createObject()', która została zaimplementowana, a następnie usunięta), obawiam się. Wierzę, że '__call()' przeciążenie zniknęło, gdy [zobacz @method hinting usunięte: -)] (https://github.com/magento/magento2/blob/master/app/code/core/Mage/ Sprzedaż/Model/Order.php) – benmarks

Odpowiedz

3

Moim zdaniem najbezpieczniej jest, aby zawsze używać getData($key). Magiczny getter używa tej samej metody, co już wskazałeś. Zaletą jest to, że można znaleźć wszelkie odniesienia do getData w kodzie i zmienić go odpowiednio w przypadku metoda getData() jest refactored. Porównaj to z koniecznością sprawdzenia wszystkich wywołań metod magicznych, w których zawsze są one nazywane inaczej. Drugą rzeczą jest to, że magia getter może cię łatwo wkręcić, gdy masz sposobu, który jest nazwany w ten sam sposób (myślę getName() got me raz i zajęło trochę czasu do debugowania). Więc mój głos jest zdecydowanie za korzystanie z getData().

+0

Kolejny powód: Używanie getData() jest jasne, która metoda jest używana, więc nowi w Magento są w stanie określić, co się dzieje. W przeciwieństwie do magicznego gettera jako nowicjusza, musisz dowiedzieć się, co dzieje się z magicznymi metodami. – mpaepper

9

Nie ma jednej odpowiedzi pasującej do wszystkich sytuacji i najlepiej zdecydować na podstawie używanego modelu i konkretnego przypadku użycia.

Wydajność jest dość słaba w przypadku metod magicznych, a także dodatkowego kosztu konwersji z CamelCase do under_score na każdym akcesoru.

magiczne metody są w zasadzie opakowaniem dla getData() w każdym razie, z dodatkowym obciążeniem.

Jest to jedna zaleta korzystania z magicznych metod chociaż, na przykład:

jeśli używasz getAttributeName() zamiast getData („attribute_name”)

w pewnym momencie w przyszłości, model może być zaktualizowano, aby zawierał rzeczywistą, konkretną metodę getAttributeName(), w którym to przypadku Twój kod nadal będzie działał poprawnie. Jednak jeśli użyłeś getData(), uzyskujesz bezpośredni dostęp do atrybutu i omijasz nową metodę, która może zawierać ważne obliczenia, które pomijasz.

0

Jak wspomniano wcześniej, najlepiej jest używać getData w stosunku do magicznych metod. Chciałem tylko dodać 2 szybkie punkty:

1) Narzut wydajności nie jest tak niewielki, zwłaszcza ze względu na implementację _underscore w Varien_Object (jak wspomniał Andrew).

2) Implementacja getData posiada pewną logikę, która pomaga "udawać" kod, i chociaż jest to mała wolniejsza niż typowe wywołania getData, jest nadal znacznie szybsza niż metody magiczne.

Jeśli masz zagnieżdżone Varien_Object jest tak, że trzeba wykonać połączenia jak:

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

można również przeprowadzić tę rozmowę tak:

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