2013-01-21 12 views
5

Vマジックゲッターは魔法ゲッターとのgetDataを(使用しての間で決めるカント)Magentoの、私は今、常にしばらくの間、Magentoのを使用しているのgetData

誰かが(離れてわずかなパフォーマンス・オーバーヘッドから、主な違いを説明することができますし、それは非常にわずかでなければならない)。

私は面で考えています:

  1. 未来のコード証明(私はMagentoの2は魔法ゲッターを使用しないと思います)
  2. 文体
  3. パフォーマンス
  4. 安定
  5. への任意の他の理由を他に1を使用する

ありません両方の混合物を使用しているため、コアコードに基づいた明確な方法

+0

を「私はMagentoの2ではないだろうと思いマジックゲッターを使用していますか? " – benmarks

+0

@benmarks私はそれも数回読んだ。ここで例を探してみてください:http://dimitrigatowski.com/tag/magento-2/ "Magento 2では魔法のゲッターとセッターはありません" – mpaepper

+0

@mpaepperはい、その投稿には同様の古くからの不正確もたくさんあります(例えば 'createObject()'の構文が実装されて削除された)、私は恐れています。 @method hinting removed: - )](https://github.com/magento/magento2/blob/master/app/code/core/Mage/)を見ると '__call()'オーバーロードがなくなったと思います。 Sales/Model/Order.php) – benmarks

答えて

3

私の意見では、最も安全な方法は常にgetData($key)を使用することです。魔法のゲッターはあなたがすでに指摘したのと同じ方法を使います。 利点は、getData()メソッドがリファクタリングされている場合に、コード内のgetDataへの参照をすべて見つけて適切に変更できることです。マジックメソッド呼び出しの名前が常に異なっている場所を調べなければならないことと比較してください。 2つ目は、同じ方法で名前が付けられたメソッド(getName()は一度私を得て、デバッグにかなり時間がかかっていたと思います)があるときに、魔法のゲッターが簡単にあなたを台無しにする可能性があるということです。 私の投票は確かにgetData()を使用しています。

+0

もう一つの理由:getData()の使用方法はどのメソッドが使用されているのかはっきりしているので、Magentoを初めて使う人は何が起こっているのかを識別できます。新人としての魔法のゲッターとは対照的に、あなたは魔法の方法で何が起こっているのか把握する必要があります。 – mpaepper

9

すべての状況に対応できる答えは1つではありません。使用しているモデルと特定のユースケースに基づいて決定することをお勧めします。

パフォーマンスは、魔法の方法や、各アクセサーのCamelCaseからunder_scoreに変換する際の余分なオーバーヘッドのためにかなり悪いです。

マジックメソッドは、基本的に余分のオーバーヘッドを伴うgetData()のラッパーです。

ありますが、たとえば、しかしマジックメソッドを使用しての一つの利点である:

あなたが将来のある時点でgetAttributeName()ではなくのgetData(「ATTRIBUTE_NAME」)

を使用している場合、モデルがかもしれ実際の具体的なgetAttributeName()メソッドを含むように更新されました。この場合、コードは正常に動作します。ただし、getData()を使用した場合は、属性に直接アクセスし、新しいメソッドをバイパスします。これには、バイパスしている重要な計算が含まれている可能性があります。

0

前述のように、getDataを魔法に使うのが最善です。

1)パフォーマンスのオーバーヘッドはそれほど軽くはありません。特に、Varien_Object(Andrewが述べたように)に_underscoreが実装されているためです。

2)getDataの実装には、コードを「プレティア」するのに役立つロジックがありますが、少しでも普通のgetData呼び出しよりも遅いですが、まだ魔法よりも高速です。

あなたのような呼び出しを実行する必要があるように、あなたはVarien_Object年代を入れ子にしている場合:

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

あなたも、このようにそのコールを実行することができます。

$firstObject->getData('second_object/third_object/some_string'); 
関連する問題