由于之前只学习了一个星期的zf,只停留在简单的使用上,对机制的理解还不够透彻。今天想仿照ZF新建一个简单的MVC框架,算是对自己先前一段时间的总结,也是为了更加深入的了解ZF,毕竟zf够强大。
废话不多说,首先配置虚拟机,配置好虚拟机后,设置rewrite机制,几经波折,完成了。参考zf的index.php,开始写。毕竟自己是菜鸟,所以写的不太好。
首先配置好环境变量。当遇到font控制器实例化的时候出现问题了,我提取了URi之后并且加载了相关的控制器,如何实例化控制器成了一个问题。上网百度了下关于font的相关介绍。
zendframework的工作流程
那么url所请求的控制器是如何实例化的?font是通过什么方式实现的?这就是我所关心的问题。
fontcontroller采用的是单例模式,关于这一知识点,总结如下:
单例模式的特点:一个类只有一个实例,并且通过getinstance自行创立,必须向整个系统提供这个实例(这个还有点不太明白,zendframework里面font控制器说明这一点,more example?)于是我把自己的font类改为单例模式:
1 <?php 2 /* 3 * font用来完成URL请求的分配 4 * 这里学习了单例模式的基本格式以及概念 5 * 6 * */ 7 class Font 8 { 9 static private $_instance=NULL; 10 private function __construct(){ 11 12 } 13 14 private function __clone(){ 15 16 } 17 static public function getInstance(){ 18 if(is_null(self::$_instance)||!isset(self::$_instance)){ 19 self::$_instance=new self(); 20 } 21 return self::$_instance; 22 } 23 24 public function disPatch(){ 25 echo 'OK'; 26 } 27 28 29 30 31 }
经过测试,成功,但是,还是没有解决关于类和方法的实例化问题。几经思索,突然想起了上学期看到的《PHP模式框架与测试》里面关于映射的概念。google了一下,应用如下
1 public function disPatch(){ 2 $url=$_SERVER["REQUEST_URI"]; 3 $pattern='/\//'; 4 $array=preg_split($pattern, $url); 5 $controller=$array[1].'Controller'; 6 $action=$array[2].'Action'; 7 include PATH.'/controller/'.$controller.'.php'; 8 $conclass=new ReflectionClass($controller); 9 $act=$conclass->getMethod($action); 10 $con=$conclass->newInstance(); 11 $act->invoke($con); 12 }
测试ok