php之我可以从类外部的特征中调用静态函数吗

lyhabc 阅读:74 2025-01-19 22:14:33 评论:0

请考虑以下情况:有多个类都需要访问配置存储机制,但是由于框架的架构而无法从基类进行扩展。
除此之外,我还想保持存储机制的灵活性(以后可以切换存储后端)。

我觉得创建一个特征来进行实际保存并在所有类中使用这些功能是有意义的(例如,我使用$_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
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号