php中简单实现控制器,操作和全局捕捉异常错误

来源:赵克立博客 分类: PHP 标签:php报错PHP发布时间:2017-12-16 14:59:02最后更新:2017-12-16 15:54:05浏览:3271
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2017-12-16 15:54:05
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

有时使用php写一个小型的网站时,如果再使用一个框架显示得就有点多余啦于是就整理啦一个简单的从参数定向到指定的类和方法,并且添加全局的异常和错误处理方法,这样一个小的网站就可以使用啦,

异常和错误处理

下面是三个设置错误处理够本的方法

// 设定错误和异常处理
//脚本结束时自动会调用这个函数,常用来捕获set_error_handler不能捕获到的致命错误
register_shutdown_function('fatalError');
//异常捕获
set_exception_handler('appException');
//用户自定义错误捕获,函数设置用户自定义的错误处理程序,然后触发错误(通过 trigger_error()):
set_error_handler('appError');

下面是定义的方法,程序出错时就会重定向到这个地方

/**
 * 自定义异常处理
 * @access public
 * @param mixed $e 异常对象
 */
function appException($e) {
	$error            = array();
	$error['message'] = $e->getMessage();
	$trace            = $e->getTrace();
	if ('E' == $trace[0]['function']) {
		$error['file'] = $trace[0]['file'];
		$error['line'] = $trace[0]['line'];
	} else {
		$error['file'] = $e->getFile();
		$error['line'] = $e->getLine();
	}
	$error['trace'] = $e->getTraceAsString();
	// 发送404信息
	header('HTTP/1.1 404 Not Found');
	header('Status:404 Not Found');
	halt($error);
}

/**
 * 自定义错误处理
 * @access public
 * @param int $errno 错误类型
 * @param string $errstr 错误信息
 * @param string $errfile 错误文件
 * @param int $errline 错误行数
 * @return void
 */
function appError($errno, $errstr, $errfile, $errline) {
	switch ($errno) {
	case E_ERROR:
	case E_PARSE:
	case E_CORE_ERROR:
	case E_COMPILE_ERROR:
	case E_USER_ERROR:
		ob_end_clean();
		$errorStr = "$errstr " . $errfile . " 第 $errline 行.";
		// if (C('LOG_RECORD')) {
		// 	Log::write("[$errno] " . $errorStr, Log::ERR);
		// }

		halt($errorStr);
		break;
	default:
		$errorStr = "[$errno] $errstr " . $errfile . " 第 $errline 行.";
		// trace($errorStr, '', 'NOTIC');
		halt($errorStr);
		break;
	}
	//这里返回false,交给系统输出错误信息,上线后可注释掉
	// return false;
}

// 致命错误捕获
function fatalError() {
	if ($e = error_get_last()) {
		switch ($e['type']) {
		case E_ERROR:
		case E_PARSE:
		case E_CORE_ERROR:
		case E_COMPILE_ERROR:
		case E_USER_ERROR:
			ob_end_clean();
			halt($e);
			break;
		}
	}
}

/**
 * 错误输出
 * @param mixed $error 错误
 * @return void
 */
function halt($error) {
	//Log::write($error['message']);
	$debug = true;
	$e     = array();
	// var_dump($error);
	if ($debug) {
		//调试模式下输出错误信息
		if (!is_array($error)) {
			$trace        = debug_backtrace();
			$e['message'] = $error;
			$e['file']    = $trace[0]['file'];
			$e['line']    = $trace[0]['line'];
			ob_start();
			debug_print_backtrace();
			$e['trace'] = ob_get_clean();
		} else {
			$e = $error;
		}
		// trace($e);
		var_dump($e);
		// if (IS_CLI === true) {
		// 	exit($e['message'] . PHP_EOL . 'FILE: ' . $e['file'] . '(' . $e['line'] . ')' . PHP_EOL . $e['trace']);
		// }
	} else {
		// 否则定向到错误页面
		$message      = is_array($error) ? $error['message'] : $error;
		$e['message'] = $message;

		// 包含异常页面模板
		$exceptionFile = './ainiku_exception.tpl';
		include $exceptionFile;
	}
	exit;
}

控制器和方法

这个很简单直接从参数中解析出来就行

//解析参数并且定向到指定的类的方法
$controller = 'Admin';
$action     = 'index';
if (isset($_GET['c'])) {
	$controller = $_GET['c'];
}
if (isset($_GET['a'])) {
	$action = $_GET['a'];
}
if (class_exists($controller)) {
	$api = new $controller;
	if (method_exists($api, $action)) {
		$api->$action();
	}
}



微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python