仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1804|回复: 19
打印 上一主题 下一主题

[学习教程] PHP网页编程之一步步编写PHP的Framework(十)

[复制链接]
冷月葬花魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-16 00:22:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
对于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:14 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
admin 该用户已被删除
板凳
发表于 2015-2-21 20:55:47 | 只看该作者
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
分手快乐 该用户已被删除
地板
发表于 2015-2-28 19:15:21 | 只看该作者
实践是检验自己会不会的真理。
只想知道 该用户已被删除
5#
发表于 2015-3-10 04:55:53 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
愤怒的大鸟 该用户已被删除
6#
发表于 2015-3-11 00:25:58 | 只看该作者
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
乐观 该用户已被删除
7#
发表于 2015-3-11 20:30:27 | 只看该作者
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
谁可相欹 该用户已被删除
8#
发表于 2015-3-19 11:36:17 | 只看该作者
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
金色的骷髅 该用户已被删除
9#
发表于 2015-3-19 15:59:40 | 只看该作者
没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。
山那边是海 该用户已被删除
10#
发表于 2015-3-28 12:36:38 | 只看该作者
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
11#
发表于 2015-4-1 09:10:54 | 只看该作者
本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。
兰色精灵 该用户已被删除
12#
发表于 2015-4-10 01:12:41 | 只看该作者
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
不帅 该用户已被删除
13#
发表于 2015-4-14 16:48:11 | 只看该作者
建数据库表的时候,int型要输入长度的,其实是个摆设的输入几位都没影响的,只要大于4就行,囧。
爱飞 该用户已被删除
14#
发表于 2015-4-16 00:09:01 | 只看该作者
学习php的目的往往是为了开发动态网站,phper就业的要求也涵盖了很多。我大致总结为:精通php和mysql
飘飘悠悠 该用户已被删除
15#
发表于 2015-4-16 16:11:41 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
小女巫 该用户已被删除
16#
发表于 2015-4-21 20:49:02 | 只看该作者
爱上php,他也会爱上你。
透明 该用户已被删除
17#
发表于 2015-4-26 01:41:43 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
活着的死人 该用户已被删除
18#
发表于 2015-4-29 17:19:10 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
飘灵儿 该用户已被删除
19#
发表于 2015-5-6 19:30:23 | 只看该作者
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
因胸联盟 该用户已被删除
20#
发表于 2015-5-6 20:14:58 | 只看该作者
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 03:57

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表