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

Neo*_*734 6 php standards class 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;
  }

}
Run Code Online (Sandbox Code Playgroud)

这在课堂上非常有效。然而,还有一个文件不是类,而是普通的 PHP,我还需要知道是否启用了该设置。

我尝试将函数声明为static

trait MyTrait {

  static function setting_enabled() { // Declared as static function
    return !empty($_SESSION['setting']) ? TRUE : FALSE;
  }

  ...
}
Run Code Online (Sandbox Code Playgroud)

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

if (MyTrait::setting_enabled()) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

我可以这样做吗(从 PHP 5.6 开始,但也考虑 PHP 7.x 的未来)?

Pau*_*hev 8

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

如果您在 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
}
Run Code Online (Sandbox Code Playgroud)

代码也可能是您想要直接实现的类,而无需 trait。

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


小智 6

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

...
(new class { use MyTrait; })::myFunc();
...
Run Code Online (Sandbox Code Playgroud)

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

  • 显然,从特征调用静态方法是有效的:https://3v4l.org/uQfuK,尽管它在 8.1 中已被弃用(这是正确的) (2认同)