老的项目很多不规范,到处都是require/include_once。为了不再到处写require/include(_once)了,应该给项目写个自动加载器了,避免重复加载和建立规范。个人觉得require_once和require之间的性能差异不大,特别是开启了APC缓存后,手动加载和自动加载之间的差异也不大。关于APC缓存类文件有争议,建议阅读参考链接和相关评论。
function autoloader($class){
if (class_exists($class, false) || interface_exists($class, false)) {//如果已存在就不需要了
return;
}
$directorys = array(
MVC_PATH.'/'.'library'.'/',
MVC_PATH.'/'
);
$file = str_replace('_', '/', $class) . '.php';//对类命名进行文件路径解析映射
foreach($directorys as $directory){
if(file_exists($directory.$file)){
require_once($directory.$file);
return;
}
}
}
spl_autoload_register(autoloader);
zend framework官方的优化建议里建议去掉require_once改用Zend_Loader_Autoloader,认为require_once会花掉很多时间。官方有去除require_once的shell脚本,这里发一个windows下注释掉zend framework library 中的require_once的bat脚本,建议还是用其他工具比较好。这个脚本也可以用来批量查找替换指定目录下面,指定后缀(类型)文件中的指定字符串。
@echo off
set directory=D:\PROGRA~1\wamp\www\
set ext_name=php
set old_char=require_once
set new_char=//require_once
setlocal enabledelayedexpansion
for /r %directory% %%x in (*.%ext_name%) do (
for /f "tokens=*" %%i in (%%x) do (
set "var=%%i"
set "var=!var:%old_char%=%new_char%!"
echo !var!>>tmp.php
)
move tmp.php %%x
)
参考链接:
PHP Autoloading Classes
ZendFramework官方提供的优化没有实际意义
再一次, 不要使用(include/require)_once
Is Autoloading A Good Solution?