med*_*iev 5 php spl autoloader spl-autoloader
在我在服务器端的include_path中,我在'/ usr/share/pear /'中引用了一个pear目录.在我的应用程序中,我包含来自公共库的文件,位于'/ usr/share/pear/library /'中require_once 'library/file.php'.
我最近开始使用spl自动加载器,我注意到在加载器函数中你必须确定包含文件的逻辑.我这样做的第一种方法是尝试包含一个文件并用它@来抑制它以查看它是否会失败,例如,@include 'library/file.php'我认为主要是因为我读了很多关于@不良做法的事情我决定通过爆炸get_include_path来自己手动完成工作.PATH_SEPARATOR并查看目录是否是我想要的目录,然后执行file_exists并包含它.
像这样:
function classLoader( $class ) {
$paths = explode( PATH_SEPARATOR, get_include_path() );
$file = SITE_PATH . 'classes' . DS . $class . '.Class.php';
if ( file_exists( $file) == false )
{
$exists = false;
foreach ( $paths as $path )
{
$tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php';
if ( file_exists ( $tmp ) )
{
$exists = true;
$file = $tmp;
}
}
if ( !$exists ) { return false; }
}
include $file;
}
spl_autoload_register('classLoader');
Run Code Online (Sandbox Code Playgroud)
我走错了路吗?我应该刚刚完成这项@include业务,还是我正朝着正确的方向努力?
Habari项目自动加载器有趣的一件事就是将整个类文件列表缓存在内存中,这样每次请求类时都不会对文件进行磁盘搜索.
本质上,你在你的内部声明一个静态__autoload(),它包含所有类文件的数组,由类引导它们加载.例如,代码将使用Dir或glob()生成此静态数组:
$class_files = array(
'user' => '/var/www/htdocs/system/classes/user.class.php',
);
Run Code Online (Sandbox Code Playgroud)
然后,您只需包含$class_files[$class]以获取正确的文件.这很好而且快速,因为它一次从磁盘获取目录,而不是每次引用新类时生成列表或搜索特定文件名.(你会惊讶于它产生了多大的速度差异.)
如果类名不是数组中的键,则可以抛出自定义异常或生成要返回的存根/模拟类.此外,如果您查看Habari系统自动加载器,您将看到Habari __static()在自动加载的类中实现,这类似于静态类的构造函数.
include_once()应避免使用,@如果您检查要包含的文件,则不需要操作员.