【问题标题】:Lazy Classes Includes PHP惰性类包括 PHP
【发布时间】:2010-11-20 18:24:55
【问题描述】:

我使用自动加载器来包含类。我现在正在做的是使用“glob”来读取不同的目录并将它们推送到一个数组中。有没有更好的解决方案?

$path = './';

$files = array_merge(
glob($path.'includes/classes/system/*.class.php'),
glob($path.'includes/classes/system/baseclasses/*.class.php'),
glob($path.'includes/classes/system/systementities/*.class.php'));

编辑:

我在自动加载类中使用它。问题是我必须使用 glob 搜索文件。有没有更快的方法来做到这一点?

【问题讨论】:

    标签: php autoload glob spl-autoload-register


    【解决方案1】:

    每当您尝试使用 PHP 不知道的类时,都会触发自动加载。如果您使用include/require,PHP 将遍历您在 PHP.ini 中为include_path 指定的所有目录,因此没有理由使用glob。在您的情况下,将 include_path 设置为

    就足够了
    /path/to/includes/classes/system/
    

    包含文件的最快方法是使用class2file map。但是,这需要您创建这样的地图并在修改应用程序时保持更新。

    【讨论】:

    • 但是这里我也需要这些文件。所以上面的代码没有改变。我已经使用了 spl_autoload_register(如标签所示)
    • “我需要这些文件”是什么意思?如果您需要地图,因为您认为在 include_path 上搜索速度很慢,请考虑使用任何策略生成地图,并将其缓存在某处(简单文件、APC、memcache)。
    • 听起来更好,我试试看!
    【解决方案2】:

    PHP 已经为您解决了这个问题。使用 PHP 的built-in autoloader。当语言/框架为您提供时,切勿自行滚动。

    【讨论】:

      【解决方案3】:
      function __autoload($class) {
        $classfile = $class.'.class.php';
        $path = './includes/classes/system/';
        if (is_file($path.$classfile)) require_once($path.$classfile);
        if (is_file($path.'baseclasses/'.$classfile)) require_once($path.'baseclasses/'.$classfile);
        if (is_file($path.'systementities/'.$classfile)) require_once($path.'systementities/'.$classfile);
      }
      

      ...这仍然不是最好的方法,但它可以让你使用 glob()。如果您通常加载所有系统实体,则在引导/配置脚本中应该有一个硬编码的 require() 列表。关于如何组织和获取类文件有很多选择。为了减少搜索脚本的时间,您可以将文件树视为一个接口。为简单起见,您可以将所有非强制类放在同一个文件夹中,将 is_file() 调用减少到一个。

      在我的系统中,我将对象类与它们各自的控制脚本和视图分组在文件夹中。我的 __autoload() 函数有一个更简单的工作 --

      $classfile = $path.$class.'/'.$class.'_class.php';
      if (is_file($classfile)) require_once($classfile);
      

      【讨论】:

      • 我使用单例类来存储文件,所以我只需要进行 isset 检查而不是 is_file 检查
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2013-07-12
      • 2011-05-12
      • 2011-09-27
      • 2013-08-30
      • 1970-01-01
      相关资源
      最近更新 更多