SPL自动加载的最佳实践
-
19-09-2019 - |
题
在我的在服务器侧的include_path我不得不梨目录的引用,在“的/ usr /共享/梨/”。在我的应用我包括来自一个共同的库文件,生活在“在/ usr /共享/梨/库/”与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');
我是不是走错路线?如果我刚才做了@include
业务还是我在正确的方向上稍微做什么呢?
解决方案
有一件事情是, Habari的项目自动加载这是否有趣的是在内存中缓存整个类文件列表中,这样,它不是每次都做磁盘搜索文件请求的类。
从本质上讲,你宣布你__autoload()
保存所有的类文件的数组,由类索引中的静态,这将导致他们加载。例如,代码将使用风向或glob()
生成这个静态数组:
$class_files = array(
'user' => '/var/www/htdocs/system/classes/user.class.php',
);
然后只需简单$class_files[$class]
以获得正确的文件。这是很好的,快捷的,因为它从磁盘目录中一次全部,而不是生成列表或搜索特定文件名各一个新的类被引用时。 (你会惊讶多少的速度差它使。)
如果类名是不是数组中的一个关键,可以抛出一个自定义异常或生成存根/模拟类返回。另外,如果检查出Habari的系统自动加载,你会看到Habari的实现类中__static()
被自动加载,这是像静态类的构造函数。
include_once()
是要避免的,如果你已经检查该文件以包括@
操作是不必要的。
其他提示
我亲自去使用方式
function autoload($class) {
/* transform class name into filename ... */
include $class;
}
即使没有@以便调试(错误被关闭/登录生产)
您可能也有兴趣在PHP的开发者名单上的相关讨论: HTTP:/ /marc.info/?t=125787162200003&r=1&w=2