惰性类包括PHP

时间:2010-11-20 18:24:56

标签: php autoload glob spl-autoload-register

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

$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'));

编辑:

我在autoload类中使用它。问题是我必须用glob搜索文件。有更快的方法吗?

3 个答案:

答案 0 :(得分:1)

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

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

最快包含文件的方式是使用class2file map。但是,这需要您创建此类映射并在修改应用程序时保持更新。

答案 1 :(得分:1)

PHP已经为您解决了这个问题。使用PHP的built-in autoloader。当语言/框架为您提供时,永远不要自己动手。

答案 2 :(得分:0)

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()。如果您通常加载所有系统,则应该在boot / config脚本中有一个硬编码的require()列表。关于如何组织和获取类文件有很多选项。为了减少搜索脚本的时间,您可以将filetree视为一个接口。为简单起见,您可以将所有非必需类放在同一个文件夹中,将is_file()调用减少为一个。

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

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