我的PHP应用程序通常使用类作为名称空间。这些类中的方法被定义为静态的。
既然PHP已经引入了一些特性,我就想在什么时候使用它们。我看到了一些使用特性的例子,但我认为这可以通过静态类方法轻松地实现。
下面列出了一个使用记录器的非常彻底的示例:Traits in PHP – any real world examples/best practices?
但是,如果您也可以使用静态Logger::log(),那么为什么要使用一个特性呢?我现在唯一能想到的就是很容易地访问$this。我现在面对的另一个例子是用户存在函数。特征,还是静态的方法?
有人能解释一下这件事吗?
发布于 2014-04-21 07:53:48
在阅读了有关问题的意见后,我对答案的看法如下:
特性允许扩展类,而不是类层次结构的一部分。不需要像class Book extends Loggable这样的东西,因为Book本身不是一个Loggable,我们只是想要Loggable功能。Loggable中的功能可以填充在一个特性中,因此可以像从它扩展一样使用Book中的Loggable方法。
在类(或命名空间函数)中使用静态方法的优点是,该特性可以访问完整的类范围,也可以访问私有成员。
使用静态函数而不是特性的缺点是类之间的紧密耦合(依赖关系),这会损害可重用性,并会损害单元测试(例如,在使用模拟服务时)。应该在运行时注入依赖项,这确实会增加类/方法实例化的工作量,但它允许在整个应用程序上具有更好的灵活性。这对我来说是一个新的见解。
发布于 2018-03-28 08:51:55
我只对简单的助手方法one-liners使用特性,这是我在几个类中经常需要的。
当没有特征时,我使用了公共静态方法--对于这些特性,也可以将其定义为正常的私有方法。
或者,您可以使用特性来定义基本的虚拟函数,并结合带有接口的类来确保每个方法都存在。
这些特性的优点是,您可以在几个类中使用相同的方法,对于小的更改,您不必在所有类中重写相同的方法。特质只是时间守护者。;)
顺便说一下..。spl_autoload_register也可以处理特性文件的加载。;)
发布于 2014-04-19 17:51:23
特征可以访问对象的私有成员。
https://stackoverflow.com/questions/23172863
复制相似问题