Kib*_*bee 3 php class include autoload
我想知道在我的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;
}
Run Code Online (Sandbox Code Playgroud)
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]);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,文件命名约定必须是[class_name] .class.php.更改目录类将被查找autobuild.php
.您也可以在找不到类时从autoload函数运行autobuilder,但这可能会使您的程序进入无限循环.
序列化数组非常快.
@JasonMichael:PHP 4已经死了.克服它.
归档时间: |
|
查看次数: |
2975 次 |
最近记录: |