对象方法调用VS类方法调用.最佳实践


Object method call VS class method call. Best practice?

我正在用PHP编写一个应用程序,我在一个称为工具箱的类中收集了一组杂项函数

Class toolbox {
  public function misc($var) {
    return do_something($var);
  } 
}

我正在将工具箱加载到我的各种脚本中,然后使用它,但我不确定最佳实践应该是什么…

选项1:对象方法调用

__construct() {
  require_once('toolbox.php');
  $this->ToolBox = new toolbox;
}
some_function($input){
  return $this->ToolBox->misc($input);
}

选项2:类方法调用

__construct() {
  require_once('toolbox.php');
}
some_function($input){
  return ToolBox::misc($input);
}

这方面有什么最佳实践吗?我不认为我需要工具箱的各种实例。

使它们成为静态函数

class Toolbox {
    static public function Tool1(){
    }
}
Toolbox::Tool1(); // Call the static method without instantiating the object

为什么是静态类而不是命名空间

因为静态实用程序类往往会增长,而且往往很多您可能有一个用于文件字符串数组。。。他们每个人都可以轻松地跳过5K线甚至更多但是你总是用它们吗否!它们可能会在你网站上5%的页面中使用。那么,为什么要把它们放在首位呢?

PHP的自动加载^在这里帮助了我们。但是自动加载仅适用于类,而命名空间必须包含在内。你现在有三个选择:

  • include/require所有的东西,所以你确保你的命名空间总是可以访问的,但你强迫PHP在每次运行时解析很多文件,加上你会得到实际including/requiring文件的固有性能损失
  • 在使用实用程序类的每个.php文件中保留include_once/require_once
  • 当自动加载器在后台为您完成繁重的工作时,您使用spl_autoload_register并忘记依赖关系

前两个可以使用名称空间,而最后一个需要一个静态类。当你的代码库增长很多时,你就开始欣赏autoload,并且无论别人告诉你什么,你都开始欣赏静态类。因此:

best practices == guidelines && best practices != mandatory practices
best practices != what works best in your specific scenario

^现在就为反对票做准备:)