使用魔术方法在 MVC 中编写注册表类和使用“常规”获取和设置方法编写类有一些关键的区别吗?
例如,如果我用 __get 和 __set 编写类,我会通过 $registry->foo 访问注册表对象,而另一种情况是 $registry->getObject('foo') 或类似的东西,你明白我的意思. 我对这两者之间的差异感兴趣,是更好的还是取决于特定情况或没有差异?
使用魔术方法在 MVC 中编写注册表类和使用“常规”获取和设置方法编写类有一些关键的区别吗?
例如,如果我用 __get 和 __set 编写类,我会通过 $registry->foo 访问注册表对象,而另一种情况是 $registry->getObject('foo') 或类似的东西,你明白我的意思. 我对这两者之间的差异感兴趣,是更好的还是取决于特定情况或没有差异?
没有区别。它主要是特定于语言的。所有语言对注册表的使用都是相同的,这取决于您如何在实现级别解决读/写问题。唯一重要的是实现的正确性,其他一切都取决于:a)项目级编码约定;b) 你的品味;c) 语言能力。
在 PHP 中几乎没有区别。虽然 getter 和 setter 严格定义了类接口并允许您将额外的代码(例如数据验证)放入其中,但如果要操作的属性很多,魔术方法可能会简化您的工作。但是在重载时魔法明显变慢了。
如果你的班级只是一个实体,你可以使用魔法。您可能也对Nette\Object
方法感兴趣。
人们倾向于不直接访问公共对象,而是通过它的访问器,没有什么区别,只使用访问器方法更可取,因为它可以更好地了解封装的含义,因此是一个很好的实践。
让我们暂时忽略注册表是一种反模式。
使用__set()
and__get()
会带来轻微的性能损失。但这可以忽略不计。真正的问题将在以后变得明显。
如果您必须在设置或返回之前存储需要额外计算的东西怎么办。例如,如果您要存储时间怎么办。可以说,在外部Registry
您以“漂亮”格式使用时间,但您以 unix-time 格式存储它。这需要添加一个特殊的例外去你的魔法吸气剂和二传手。
如果您存储多个这样的值怎么办。如果发生变化并且您的应用程序必须从公制迁移到英制怎么办。
随着您向存储的信息添加越来越多的条件,这通常会导致and中的大量switch
语句。真的很糟糕的设计选择。__get()
__set()