我想知道在我的PHP脚本中必须"包含"这么多文件来处理问题的最佳实践是什么,以确保我的脚本可以访问我需要使用的所有类.
目前,我只是使用include_once来包含我直接访问的类.其中每一个都是include_once
他们访问的类.
我已经研究过使用这个__autoload
函数,但是如果你计划在目录树中组织你的类文件,那么hat似乎不会很好用.如果你这样做了,看起来你最终会走到目录树,直到你找到了你正在寻找的课程. 另外,我不确定这会如何影响不同命名空间中具有相同名称的类.
有没有更简单的方法来处理这个?
或者PHP不适合具有许多不同对象的" 企业 "类型应用程序,它们都位于可以位于许多不同目录中的单独文件中.
我的应用程序我通常有setup.php
包含所有核心类(即框架和附带库)的文件.我的自定义类是使用目录布局图辅助的自动加载器加载的.
每次添加新类时,我都会运行命令行构建器脚本,该脚本扫描整个目录树以搜索模型类,然后构建关联数组,其中类名作为键,路径作为值.然后,__ autoload函数在该数组中查找类名并获取包含路径.这是代码:
autobuild.php
define('MAP', 'var/cache/autoload.map'); error_reporting(E_ALL); require 'setup.php'; print(buildAutoloaderMap() . " classes mapped\n"); function buildAutoloaderMap() { $dirs = array('lib', 'view', 'model'); $cache = array(); $n = 0; foreach ($dirs as $dir) { foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)) as $entry) { $fn = $entry->getFilename(); if (!preg_match('/\.class\.php$/', $fn)) continue; $c = str_replace('.class.php', '', $fn); if (!class_exists($c)) { $cache[$c] = ($pn = $entry->getPathname()); ++$n; } } } ksort($cache); file_put_contents(MAP, serialize($cache)); return $n; }
autoload.php
define('MAP', 'var/cache/autoload.map'); function __autoload($className) { static $map; $map or ($map = unserialize(file_get_contents(MAP))); $fn = array_key_exists($className, $map) ? $map[$className] : null; if ($fn and file_exists($fn)) { include $fn; unset($map[$className]); } }
请注意,文件命名约定必须是[class_name] .class.php.更改目录类将被查找autobuild.php
.您也可以在找不到类时从autoload函数运行autobuilder,但这可能会使您的程序进入无限循环.
序列化数组非常快.
@JasonMichael:PHP 4已经死了.克服它.