PHP:什么时候使用Traits,什么时候使用静态方法?

2022-08-30 20:03:29

我的PHP应用程序通常使用类进行命名空间。这些类中的方法被定义为静态的。

现在PHP已经引入了Traits,我正试图思考何时使用它们。我看到了一些使用特征的例子,但我认为这可以通过静态类方法轻松实现。

这里列出了一个使用记录器的非常详尽的示例:PHP中的特征 - 任何现实世界的示例/最佳实践?

但是,如果您也可以使用静态记录器::log(),为什么要使用 Trait 呢?我现在唯一能想到的就是轻松访问$this。我现在面临的另一个例子是用户存在的函数。特质它,还是静态方法它?

谁能对此有所了解?


答案 1

在阅读了对这个问题的评论之后,我对答案的看法是这样的:

特征允许扩展类,而不会成为类层次结构的一部分。不需要这样的东西,因为Book本身不是Loggable,我们只需要Loggable功能。Loggable中的功能可以填充在一个特征中,因此能够在Book中使用Loggable方法,就好像您正在从中扩展一样。class Book extends Loggable

使用特征优于在类(或命名空间函数)中使用静态方法的优点是,特征可以访问完整的类范围,也可以访问私有成员。

使用静态函数而不是特征的缺点是类之间的紧密耦合(依赖关系),这会损害可重用性并可能损害单元测试(例如,在使用模拟服务时)。依赖项应该在运行时注入,这确实增加了实例化类/方法的工作量,但允许比完整应用更好的灵活性。这对我来说是一个新的见解。


答案 2

我只将特征用于简单的帮助器方法[单行](字符串正则表达式验证,字符串规范化程序,原始数字生成器),我经常在几个类中需要这些方法。

当没有特征时,我使用公共静态方法 - 对于特征,也可以将它们定义为正常的私有方法。

或者,您可以使用特征来定义基本的虚拟函数,并结合具有接口的类,以确保每个方法都存在。

traits 的优点是可以在多个类中使用相同的方法,对于较小的更改,您不必在所有类中重写相同的方法。特质只是节省时间。;)

顺便说一句..spl_autoload_register也可以处理 trait 文件的加载。;)


推荐