6

我已经使用 magento 一段时间了,总是无法在使用魔法 getter 和 getData() 之间做出决定

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

我在考虑:

  1. 未来的代码证明(我认为 magento 2 不会使用魔法吸气剂)
  2. 风格上
  3. 表现
  4. 稳定
  5. 任何其他使用 1 的理由

基于核心代码没有明确的方法,因为它混合使用了两者

4

3 回答 3

10

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

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

无论如何,魔术方法基本上是 getData() 的包装器,具有额外的开销。

不过,使用魔法方法有一个优点,例如:

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

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

于 2013-01-22T11:58:48.747 回答
3

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

于 2013-01-21T14:20:59.370 回答
0

如前所述,最好使用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');
于 2014-05-05T18:50:57.147 回答