请考虑以下情况:有多个类都需要访问配置存储机制,但是由于框架的架构而无法从基类进行扩展。
除此之外,我还想保持存储机制的灵活性(以后可以切换存储后端)。
我觉得创建一个特征来进行实际保存并在所有类中使用这些功能是有意义的(例如,我使用$_SESSION
作为存储系统):
trait MyTrait {
function setting_enabled() {
return !empty($_SESSION['setting']) ? TRUE : FALSE;
}
function enable_setting() {
$_SESSION['setting'] = TRUE;
}
function disable_setting() {
$_SESSION['setting'] = FALSE;
}
}
这在类里面效果很好。但是,还有一个文件不是类,而是纯PHP,我也需要知道是否启用了该设置。
我试过将函数声明为
static
:trait MyTrait {
static function setting_enabled() { // Declared as static function
return !empty($_SESSION['setting']) ? TRUE : FALSE;
}
...
}
然后从trait调用static函数,效果很好。
if (MyTrait::setting_enabled()) {
...
}
但是,感觉并不完全正确。另一方面,创建一个使用该特性的新的空类并实例化该类以获取该值似乎有很多开销。
我可以这样做吗(从PHP 5.6开始,但也考虑了PHP 7.x的 future )?
最佳答案
如果您有一个特征,那么您决定一次进行一次多重继承,也许是针对多个类。否则,它是多余的声明,您必须使用一个类。实际上,特质的存在意味着它的使用。
如果您在trait中有一个静态函数,那么为什么不能在实现trait的类中使用它呢?
trait MyTrait {
static myFunc() {}
}
class ThatUsingMyTrait {
use MyTrait;
}
// pretend below a code where you want to use the trait.
if(ThatUsingMyTrait::myFunc()) {
// do something
}
该代码也可能是您想要直接实现而没有特征的类。
希望我能理解地描述这个想法。
关于php - 我可以从类外部的特征中调用静态函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42054265/