Magento,魔术getter v getData

时间:2013-01-21 14:10:37

标签: magento

我一直在使用magento一段时间并且总是无法决定使用魔法getter和getData()

除了轻微的性能开销(并且必须非常轻微)之外,有人可以解释主要区别。

我在想:

  1. 未来代码证明(我认为magento 2不会使用魔法吸气剂)
  2. 文体
  3. 性能
  4. 稳定性
  5. 使用1而不是其他的任何其他理由
  6. 基于核心代码没有明确的方法,因为它使用了两者的混合

3 个答案:

答案 0 :(得分:9)

没有一个答案适合所有情况,最好根据您使用的模型和特定用例来决定。

魔术方法的性能很差,以及在每个访问器上从CamelCase转换为under_score的额外开销。

魔术方法基本上都是getData()的包装器,但需要额外的开销。

使用魔术方法有一个好处,例如:

如果使用getAttributeName()而不是getData('attribute_name')

在将来的某个时刻,模型可能会更新为包含一个真实的,具体的getAttributeName()方法,在这种情况下,您的代码仍然可以正常工作。但是,如果您使用了getData(),则直接访问该属性,并绕过新方法,其中可能包括您正在绕过的一些重要计算。

答案 1 :(得分:3)

在我看来,最安全的方法是始终使用getData($key)。魔术吸气剂使用与您已经指出的相同的方法。 优点是您可以在代码中找到对getData的所有引用,并在重构getData()方法时对其进行适当更改。相比之下,必须找出所有魔术方法调用,它们总是以不同的方式命名。 第二件事是,当你有一个以相同方式命名的方法时,魔术吸气剂可以轻易搞砸你(我认为getName()让我一次,并且花了相当长的时间来调试)。 所以我的投票肯定是使用getData()

答案 2 :(得分:0)

如前所述,最好使用getData而不是魔术方法。只想添加2个快点:

1)性能开销并不是那么轻微,特别是因为Varien_Object中的_underscore的实现(如Andrew所述)。

2)getData的实现有一些逻辑可以帮助“预处理”代码,虽然它比典型的getData调用慢,但仍然比魔术方法快得多。

如果您已嵌套Varien_Object,则需要执行以下调用:

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

您也可以像这样执行该调用:

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