老的项目很多不规范,到处都是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?