日度归档:2011年5月17日

php5使用autoload实现类的自动加载

常州这边的公司用的框架是09年写的,二年了,所以有了重写的冲动!

新版框架采用php5的autoload类自动加载机制,使应用开发时无需require相应的文件,非常爽

[codesyntax lang=”php”]

/**
 *
 * php5自动加载类功能函数
 * @param string $class_name
 */
function loader($class_name){
	$expandCfg=cfg('expand');
	if(!empty($expandCfg) && in_array($class_name,array_keys($expandCfg))){
		$classFile=$expandCfg[$class_name];
	}else{
		$classArr = preg_split("/(?=[A-Z])/", $class_name);
		$classSysArr=array('dao','module','base','core','parent');
		$classArrLast=strtolower($classArr[count($classArr)-1]);
		if(in_array($classArrLast, $classSysArr)){
			if('base'==$classArrLast || 'core'==$classArrLast){
				$classFile=CORE_PATH.strtolower($classArr[0]).'.'.$classArrLast.'.class.php';
			}elseif('parent'==$classArrLast){
				$classFile=SITE_PATH.$classArrLast.'/'.strtolower($classArr[0]).'.'.$classArrLast.'.class.php';
			}else{
				$classFile=INCLUDE_PATH.$classArrLast.'/'.strtolower($classArr[0]).'/'.strtolower($classArr[0]).'.'.strtolower($classArr[1]).'.'.strtolower($classArr[2]).'.class.php';
			}
			//debug($classFile);

		}
		unset($classArr,$classArrLast);
	}
	if(isset($classFile) && file_exists($classFile)){
		include($classFile);
	}
}

spl_autoload_register('loader');

[/codesyntax]

另框架在上线后,自动把运行时的错误信息存log文件

[codesyntax lang=”php”]

register_shutdown_function('error_handler');
/**
 *
 * 判断当前页是否来自ajax提交
 */
function is_ajax()
{
	if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && trim($_SERVER['HTTP_X_REQUESTED_WITH']) == 'XMLHttpRequest'){
		return true;
	}else{
		return false;
	}
}

function error_handler() {
    if(isset($run_count) && $run_count === 1)
        return false;
    static $run_count = 1;
    //  获取错误信息
    $error_array = error_get_last();
    // 对notice级的错误进行清除
    if($error_array['type'] == 8) {
        $error_array = array();
    }
    if(empty($error_array) === false) {
        $url = htmlspecialchars($_SERVER['REQUEST_URI']);  // 当前请求访问url地址,
        $date = date('Y-m-d H:i:s',time());  // 当前时间
        $error = implode(' | ',$error_array);  // 将错误代码全部转化为数据.
        file_put_contents(PATH.'/log/error'.date('Y_m_d').'.txt',"$date|$url,$error; \r\n",FILE_APPEND);  // 写入日志文件中. 保护一行一条, 并且循环增加开启.
    }
}

[/codesyntax]