我可以从课外的特征中调用静态函数吗?

时间:2017-02-05 16:10:48

标签: php class standards traits

考虑这样的情况,即有多个类都需要访问配置存储机制,但由于框架的架构,无法从基类扩展。 除此之外,我还希望保持存储机制的灵活性(以后能够切换存储后端)。

我觉得创建一个可以实际保存并在所有类中使用这些函数的特征是有意义的(例如我使用$_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;
  }

  ...
}

然后从特征中调用静态函数,效果很好。

if (MyTrait::setting_enabled()) {
  ...
}

但感觉并不完全正确。另一方面,创建一个使用特征并实例化它以获取值的新空类似乎需要很多开销。

我是否可以这样做(从PHP 5.6开始,还考虑PHP 7.x的未来)?

2 个答案:

答案 0 :(得分:2)

如果你有一个特性,那么你决定进行一次多重继承,也许是多个类。否则,它是冗余声明,你必须使用一个类。事实上,特质的存在意味着它的使用。

如果你的特质中有静态函数,那么为什么你不能在课堂上使用它来实现特征?

trait MyTrait {
 static myFunc() {}
}

class ThatUsingMyTrait {
 use MyTrait;
}

// pretend below a code where you want to use the trait.
if(ThatUsingMyTrait::myFunc()) {
 // do something
}

代码也可能是你想要直接实现的类。

希望我理解地描述这个想法。

答案 1 :(得分:1)

另一个想法是中间使用匿名类:

...
(new class { use MyTrait; })::myFunc();
...

我更喜欢这种方式,因为我们不会创建不必要的类名。