我一直在使用magento一段时间并且总是无法决定使用魔法getter和getData()
除了轻微的性能开销(并且必须非常轻微)之外,有人可以解释主要区别。
我在想:
基于核心代码没有明确的方法,因为它使用了两者的混合
答案 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');