我已经使用 magento 一段时间了,总是无法在使用魔法 getter 和 getData() 之间做出决定
有人可以解释主要区别,除了轻微的性能开销(而且它必须非常轻微)。
我在考虑:
- 未来的代码证明(我认为 magento 2 不会使用魔法吸气剂)
- 风格上
- 表现
- 稳定
- 任何其他使用 1 的理由
基于核心代码没有明确的方法,因为它混合使用了两者
我已经使用 magento 一段时间了,总是无法在使用魔法 getter 和 getData() 之间做出决定
有人可以解释主要区别,除了轻微的性能开销(而且它必须非常轻微)。
我在考虑:
基于核心代码没有明确的方法,因为它混合使用了两者
没有一个适合所有情况的答案,最好根据您使用的模型和特定用例来决定。
魔术方法的性能很差,而且在每个访问器上从 CamelCase 转换为 under_score 的额外开销。
无论如何,魔术方法基本上是 getData() 的包装器,具有额外的开销。
不过,使用魔法方法有一个优点,例如:
如果您使用 getAttributeName() 而不是 getData('attribute_name')
在未来的某个时候,模型可能会更新为包含一个真实的、具体的 getAttributeName() 方法,在这种情况下,您的代码仍然可以正常工作。但是,如果您使用了 getData(),则可以直接访问该属性,并绕过新方法,其中可能包括一些您正在绕过的重要计算。
在我看来,最安全的方法是始终使用getData($key)
. 魔术吸气剂使用您已经指出的相同方法。优点是您可以在代码中找到对 getData 的所有引用,并在getData()
方法被重构时适当地更改它。将其与必须找出所有名称总是不同的魔术方法调用进行比较。第二件事是,当你有一个以相同方式命名的方法时,魔法 getter 很容易把你搞砸(我认为 getName() 得到了我一次,它需要相当长的时间来调试)。所以我的投票肯定是使用getData()
.
如前所述,最好使用getData
魔术方法。只是想添加2个快速点:
1)性能开销不是那么小,特别是因为_underscore
在 Varien_Object 中的实现(正如 Andrew 所提到的)。
2) getData 的实现有一些有助于“美化”代码的逻辑,虽然它比典型的 getData 调用慢一点,但仍然比魔术方法快得多。
如果您有嵌套Varien_Object
的,那么您需要执行如下调用:
$firstObject->getData('second_object')->getData('third_object')->getData('some_string');
您还可以像这样执行该调用:
$firstObject->getData('second_object/third_object/some_string');