用php类实现路由功能

作者:norion时间:2013年11月19日评论次数:0 条

最近看了thinkphp的视频,发现功能好强大的说,其中的路由功能跟是很赞的说,出于学习php的目的,于是决定也做一个路由功能,有需要的童鞋可以拿走哦,如果有什么好的想法欢迎以评论的形式提出,下面就是贴代码啦:

/**
 * @author norion.z
 * @class url路由
 * @version 1.0
 * 路由规则(控制和方法部分无值是会默认index):
 * index.php
 * index.php?controller
 * index.php?controller&method
 * index.php?controller&method&prarme1=value1
 * index.php?controller&method&param1=value1&param2=value2.....
 */
class dispatcher{

	private $action = null;    //模块名
	private $method = null;    //模块类名
	private $params = array(); //模块类方法

	public function __construct(){
		$this->parseUrl();
		$this->getModule();
		$this->getAction();
	}

	/**
	 * 解析url
	 */
	private function parseUrl(){
		$url        = $_SERVER["QUERY_STRING"];  //获取url信息
		$urlArr     = explode('&', $url);        //用&分割成数组
		$urlArr_num = count($urlArr);            //统计数组长度
		$keyArr     = array();
		$valArr     = array();

		/*用=分割参数名和参数值,值不存在时赋予null*/
		foreach ($urlArr as $key => $value) {
			$arr = explode('=', $value);
			$keyArr[$key] = $arr[0];
			$valArr[$key] = isset($arr[1]) ? $arr[1] : null;
		}

		if( $urlArr_num == 1 || $keyArr[0] == '' ){
			$key = $keyArr[0] ? $keyArr[0] :'index';
			$this->action = $key.'Action';
			$this->method = 'index';
		}else{
			$this->action = $keyArr[0].'Action';
			/*当第二个参数的值不为空时,默认index方法*/
			if( $valArr[1] != '' ){
				$this->method = 'index';
				$this->params = array($keyArr[1] => $valArr[1]);
			}else{
				$this->method = $keyArr[1];
			}
			if( $urlArr_num > 2 ){
				for($i = 2; $i < $urlArr_num; $i++){ 		            $urlArr_hash  = array( strtolower($keyArr[$i]) => $valArr[$i] );
		            $this->params = array_merge($this->params, $urlArr_hash);
		        }
			}
		}
		/*print_r($this->method);
		print_r('
');
		print_r($this->action);*/
	}

	/**
	 * 获取模块文件
	 */
	protected function getModule(){
		$actionPath = SOURCE_PATH . 'module/' . $this->action . '.class.php';
		if( !file_exists($actionPath) ){
			exit($this->action . ' 模块文件不存在,请检查'.$actionPath.'是否存在。');
		}
		require $actionPath;
	}

	/**
	 * 获取模块及方法
	 */
	protected function getAction(){
		/*判断类是否定义*/
		//if( class_exists( $this->action ) ){

			$class  = new $this->action();
			$method = $this->method;

			if( $method == '' ){
				$method = 'index';
			}

			/*判断类里面的方法是否定义*/
			if( method_exists( $class, $method ) ){
				/*该方法是否能被调用*/
				if( is_callable(array($class, $method)) ){
					$class->getParams( $this->params );    //调用action对象中的方法getParams()并传递参数
					$class->$method();                     //调用模块文件的方法
				}else{
					die('该方法不能被调用');
				}

			}else{
				die('方法不存在');
			}

		//}else{
		//	echo '404';
		//}
	}
}
new dispatcher();

标签:

上一篇: mysql即关联又左联出现Unknown column ‘p.post_id’ in ‘on clause’解决办法

下一篇:javascript调试利器console.table()

相关文章

评论

发表评论

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