首先我要注意,我知道OOP的原则,我知道什么是术语,方法,属性等等。
有时我需要创建可在全局范围内访问的函数,并在它们之间共享数据。例如,我在基于WordPress概念的项目钩子机制中创建。
在WordPress中,$ wp_hooks变量放在全局范围内,并且有add_action(),do_action(),add_filter(),apply_filter()函数。每个函数都输入$ wp_hooks var by" global"关键字。
在我的项目中,我创建的类只包含静态方法和属性。简单的例子:
<?php
class Hooks
{
static private $_actions = [];
static private $_filters = [];
static public function addAction() { /* code... */ }
static public function addFilter() { /* code... */ }
static public function removeAction() { /* code... */ }
static public function removeFilter() { /* code... */ }
static public function runAction() { /* code... */ }
static public function applyFilter() { /* code... */ }
}
我知道不应该以这种方式使用类。有单身模式,但我不喜欢它,我不想在我的项目中使用它。
最近我偶然了解到我可以使用与仅使用静态方法的类相同的特征。在PHP中,可以在特征中调用公共静态方法。
类和特性具有相同的语法和相似的功能(两者都可以包含函数和变量)。但是特性只是容器,没有特殊意义,当类具有特殊含义时,想法 - 在实际中某些对象组的摘要中(例如Person类或Product类)。
这是我的问题。当我改变&#34; class&#34;你认为我会犯错吗?到&#34;特质&#34;在只是容器而不是真正的类的类中?
(抱歉我的英文错误。;&gt;)
答案 0 :(得分:2)
你不应该以这种方式使用Traits - 它们更适合包含在其他类中 - 比如Ruby中的混合。但是就像在Ruby中一样,mix-ins实现为模块,模块本身可以是地址和它们的函数引用,所以PHP中的特性可以被解决并且它们的函数被引用:
trait Test {
public function foo() {
return 4;
}
}
Test::foo(); // returns => 4
可能是&#34;更好的风格&#34;对函数集合使用traits,它肯定比其他空类中的静态方法集更漂亮,但这些都不是 Right Thing(tm)。