PHP 自动加载类

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注