老的项目很多不规范,到处都是require/include_once。为了不再到处写require/include(_once)了,应该给项目写个自动加载器了,避免重复加载和建立规范。个人觉得require_once和require之间的性能差异不大,特别是开启了APC缓存后,手动加载和自动加载之间的差异也不大。关于APC缓存类文件有争议,建议阅读参考链接和相关评论。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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脚本,建议还是用其他工具比较好。这个脚本也可以用来批量查找替换指定目录下面,指定后缀(类型)文件中的指定字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @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?