我的PHP应用程序通常使用命名空间类。这些类中的方法定义为static。
现在PHP已经引入了Traits,我试图在使用它们的时候把它包围起来。我看到了一些使用特征的例子,但我认为这可以通过静态类方法轻松实现。
此处列出了使用记录器的完整示例:Traits in PHP – any real world examples/best practices?
但是为什么要使用Trait,如果你也可以使用静态Logger :: log()?我现在唯一能想到的就是轻松访问$ this。 我现在面临的另一个例子是用户存在的功能。特质吧,还是静态方法呢?
任何人都可以对此有所了解吗?
答案 0 :(得分:15)
在阅读有关问题的评论后,我对答案的看法是:
Traits允许扩展类,而不会成为类层次结构的一部分。不需要class Book extends Loggable
这样的东西,因为Book本身不是Loggable,我们只想要Loggable功能。 Loggable中的功能可以填充在特征中,因此可以使用Book中的Loggable方法,就像您从中扩展一样。
在类(或命名空间函数)中使用静态方法之上使用特征的优点是特征可以访问完整的类范围,也可以访问私有成员。
使用静态函数而不是traits的缺点是类之间的紧密耦合(依赖性),这会损害可重用性并且可能损害单元测试(例如,当使用模拟服务时)。应该在运行时注入依赖项,这确实增加了实例化类/方法的工作量,但允许在整个应用程序上具有更好的灵活性。这对我来说是一个新的见解。
答案 1 :(得分:0)
我只使用traits来处理简单的帮助器方法[one-liners](字符串regexp验证,字符串规范化器,原始数字生成器),我经常在几个类中使用它。
当没有特征时,我使用公共静态方法 - 使用特征也可以将它们定义为普通的私有方法。
或者你可以使用traits来定义基本的虚函数和带接口的类,以确保每个方法都存在。
traits的优点是你可以在几个类中使用相同的方法,对于小的更改,你不必在所有类中重写相同的方法。特质只是节省时间。 ;)
并且btw .. spl_autoload_register也可以处理特征文件的加载。 ;)
答案 2 :(得分:-3)
Traits可以访问对象的私有成员。