仓酷云
标题:
PHP网页编程之一步步编写PHP的Framework(十)
[打印本页]
作者:
冷月葬花魂
时间:
2015-2-16 00:22
标题:
PHP网页编程之一步步编写PHP的Framework(十)
对于PHP的语法结构,刚开始真的很不习惯,真搞不懂为什么每个变量之前都要加个“$”符号,每个语句写完之后都必须加上“分号”来表示此句已经结束,还有,PHP对字母的大小写是敏感的,写的时候一定要注意大小写的区别。
之前讲了这么多,实践上都只是为框架搭建了一个架子罢了,框架外面还没有甚么器材, 从明天入手下手,我就入手下手从Controller,Model,View这几块儿来分离引见一下。
PS:之前的良多内容我都没有细讲,就好比路由,真实的框架路由一定不是经由过程GET体例指定的,而是正则,而且它需求兼容多个Server,多种体例。
咱们晓得一切的恳求都需求经由掌握器,所以起首仍是说一下掌握器。
咱们之前已 说过掌握器的概念了,然而这个掌握器仍是功效太弱了,由于它只是从功效上是掌握器,框架并没无为它做任何工作,框架实践上可以完成一些经常使用的功效,然后用户界说的掌握器承继它,如许用户可以少写良多代码的。
之前的掌握器是:
1 <?php 2 class IndexController { 3 public function index() { 4 echo 'Hello world'; 5 } 6 } 如今假定框架已完成了掌握器的一些根基功效,这个类咱们称为Controller.php,那末如今代码就酿成了:
1 <?php 2 class IndexController extends Controller { 3 public function index() { 4 echo 'Hello world'; 5 } 6 } 如许做有甚么优点呢,因为Controller承继了Base,所以IndexController也具有了Base的功效,如许就不需求用户再编写良多捕捉的代码等。
固然,如许做也出缺点,测试IndexController的时分对照费事。
明天我先说一下掌握器对照基本的两个功效,跳转和转发。
起首是跳转,这个用的太广泛了,好比用户登录的时分,点击登录按钮,进入后台处置的页面,处置终了以后就需求跳转,那末怎样完成跳转呢?
有几种体例:
第一种:<script>location.href = "XXXX";</script>在JS中完成跳转;
第二种:header("Location:url");详细利用可检查PHP手册;
第三种:在HTML的meta中设置refresh;
因为header挪用的时分假如之前页面已有输入,跳转会生效,所以需求联合meta的refresh一同利用,固然,你也能够直接利用JS的这类体例来完成,只是我不太喜好这类体例,由于我之前利用这类体例完成跳转的时分出干预干与题。
如今咱们界说跳转这个函数的名字为_redirect,为何后面加上_呢,这也是我的一个习气,关于函数,只需不是public,我都利用_作为前缀。能够人人会问了,为何不设置这个函数为public呢,由于用户编写的掌握器也只会承继它而不会直接挪用,所以我设置成了protected。
1 protected function _redirect(Array $arr) { 2 3 4 }
临时可以将功效弄得弱一点,假定跳转的参数经由过程数组传递过去,那末咱们可使用类型提醒(Array $arr)这类体例来弄定,假如传递的参数不是数组,那末直接会报错。
咱们利用的体例可所以如许:
1 $this->_redirect(array( 2 'action' => 'test', 3 'controller' => 'Test', 4 'param1' => '1' 5 ));
它代表的意思是跳转到Test这个掌握器的test这个Action,而且还传递了一个参数,这个参数名为param1,值为1。
01 protected function _redirect(Array $arr) { 02 $controller= empty($_GET['c']) ? C('defaultController') : trim($_GET['c']); //设置了默许的掌握器 03 $action= empty($_GET['a']) ? C('defaultAction') : trim($_GET['a']); //设置了默许的Action 04 array_key_exists('controller',$arr) $arr['controller'] = $controller; 05 array_key_exists('action',$arr) $arr['action'] = $action; 06 $str = '/?'; 07 foreach($arr as $key => $val) { 08 if(!is_int($key)) { 09 $str .= ($key . '=' . $val . '&'); 10 } 11 } 12 $str = substr($str,0,strlen($str) - 1); 13 Response::redirect($str); 14 }
这个就是我方才手写的跳转代码,实践上就是把传递的数组拼接一下然后构成一个字符串,这个字符串就能够当作是一个URL,因为如今没有对Route.php停止更多的处置,关于localhost/demo2/index.php?controller=a这类URL它跳转就会失足,临时只撑持localhost/index.php?controller=a这类URL,还有$controller和$action的获得和Route.php中的代码反复了,这些都需求在前面真正完成路由的时分再解说,临时就这么看看吧,固然我本人都感到如许的代码很恶心。
能够人人都注重到了,当这个函数拼接到URL以后,是直接挪用了Response的redirect办法,这是为何呢?
第一:有能够在真正使用中,咱们直接在掌握器中挪用$this->_redirect知足不了咱们的需求,这个时分咱们就需求直接挪用Response::redirect,好比跳转到百度首页就只能挪用Response::redirect("http://www.百度.com");
第二:从逻辑上,跳转是一个办事器对客户真个呼应,所以需求写在Response中,详细的可参照Java。
那末咱们又必需新建一个Response.php如许一个文件:
01 <?php 02 class Response extends Base { 03 public static function redirect($url) { 04 if(is_string($url)) { 05 if(!headers_sent()) { 06 header("Location:" . $url); 07 exit(); 08 } else { 09 $str = '<meta http-equiv="Refresh" contect="0;url='.$url.'">'; 10 exit($str); 11 } 12 } else { 13 //毛病处置 14 } 15 } 16 } 这里的逻辑对照复杂,实践上就是剖断是不是有输入,没有输入那末就直接利用header("Location")停止跳转,假如有输入,那末利用meta的refresh跳转。
注重:实践上还可以在这个跳转上开辟更多的功效,然而因为我只是也许讲一下,所以更多的内容就不写了,有乐趣的人可以去Toper下面看看。
如许,一个对照复杂的跳转就完成了,那末怎样完成转发呢?
可以复杂如许了解,转发实践上就是再挪用了一下某一个Controller的某一个Action。
所以如许咱们就能够对照复杂的完成转发了:
01 protected function _forward(Array $arr) { 02 $controller= empty($_GET['c']) ? C('defaultController') : trim($_GET['c']); //设置了默许的掌握器 03 $action= empty($_GET['a']) ? C('defaultAction') : trim($_GET['a']); //设置了默许的Action 04 if(array_key_exists('controller',$arr)) { 05 $controller = $arr['controller']; 06 } 07 if(array_key_exists('action',$arr)) { 08 $action = $arr['action']; 09 } 10 $controller .= 'Controller'; 11 if($controller === get_class()) { 12 if(method_exists($this,$action)) { 13 $this->$action(); 14 } else { 15 //工夫无限,不写逻辑了 16 } 17 } else { 18 if(class_exists($controller)) { 19 $class = new $controller(); 20 if(method_exists($class,$action)) { 21 $class->$action(); 22 } else { 23 //工夫无限,不写了 24 } 25 } else { 26 //工夫无限,不写了 27 } 28 } 29 } 实践上逻辑上就是剖断一下要挪用的Action是不是属于本掌握器,假如是本掌握器,直接挪用$this->$action()便可,不然,需求实例化这个掌握器,即$class = new $controller(),然后再挪用这个Action。
原本觉得半个小时就能够写完,了局写了一个小时了,因为工夫超越我的预算,所以代码都是手写的,不晓得有不有甚么语法毛病甚么的,归正看看思绪就OK了。
终于学会把表单的数据插入数据库,然后显示出来了,应该说一个程序的雏形已经诞生了。
作者:
再见西城
时间:
2015-2-20 12:04
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
作者:
admin
时间:
2015-2-21 20:55
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
作者:
分手快乐
时间:
2015-2-28 19:15
实践是检验自己会不会的真理。
作者:
只想知道
时间:
2015-3-10 04:55
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者:
愤怒的大鸟
时间:
2015-3-11 00:25
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
作者:
乐观
时间:
2015-3-11 20:30
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
作者:
谁可相欹
时间:
2015-3-19 11:36
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
作者:
金色的骷髅
时间:
2015-3-19 15:59
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
作者:
山那边是海
时间:
2015-3-28 12:36
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
作者:
仓酷云
时间:
2015-4-1 09:10
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
作者:
兰色精灵
时间:
2015-4-10 01:12
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
作者:
不帅
时间:
2015-4-14 16:48
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
作者:
爱飞
时间:
2015-4-16 00:09
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
作者:
飘飘悠悠
时间:
2015-4-16 16:11
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
作者:
小女巫
时间:
2015-4-21 20:49
爱上php,他也会爱上你。
作者:
透明
时间:
2015-4-26 01:41
写的比较杂,因为我也是个新手,不当至于大家多多指正。
作者:
活着的死人
时间:
2015-4-29 17:19
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线 \\\\\\\'_\\\\\\\' ;
作者:
飘灵儿
时间:
2015-5-6 19:30
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年 具体的记不清啦,囧。
作者:
因胸联盟
时间:
2015-5-6 20:14
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2