仓酷云

标题: PHP网页编程之一步步编写PHP的Framework(十一) [打印本页]

作者: 小妖女    时间: 2015-2-16 00:22
标题: PHP网页编程之一步步编写PHP的Framework(十一)
左手拿着MOTOLOLA右手拿着NOKIA,要多潇洒,有多潇洒,哈哈,终于学会了,但是可能这个时候,又会有人不经意的拍拍肩膀对你说:哥们,别高兴的太早,你还是菜鸟,离学会还差着一大截呢!     
  之前讲了怎样让完成跳转和恳求的转发,固然,也只是很复杂的说了一下,更深的内容需求你本人去读一下详细框架的完成。
  如今跳转和转发有了,关于模子的编写可今后面再来,那我就先说一下怎样讲数据从掌握器传递到视图,之前咱们的完成体例十分丑恶:
1 $viewPath = dirname(__FILE__) . '/../views/index.php'; 2 if(file_exists($viewPath)) { 3     include $viewPath; 4 } else { 5     echo 'view does not exists'; 6 }  如今我筹办用更优雅一点的体例将数据传递到视图,如今先说一下怎样挪用:
01 <?php 02 class TestController extends Controller { 03     public function test() { 04         $this->_assign(array( 05             'arr' => array( 06                 'test','test2' 07             ), 08             'str' => 'it is a str' 09         )); 10         $this->_display('test'); 11     } 12 }   
  这就是明天我写以后的挪用体例,假如你学过smarty,那末你会发明这和smarty很类似,切实其实,我写toper的时分也是受了smarty的影响,最入手下手的设法是视图这一块就利用smarty,前面想了一下,既然号称是本人的框架,那末视图这一起一定也要全体本人写,固然如斯,然而我前面仍是保存了assign,display这类写法,而且只需设置装备摆设文件修正,完整可以将视图切换到smarty而不利用框架自己的完成。
  仿佛扯得有点远了,起首说一下,为了代码的复杂,我将assign和display的完成简化,人人了解思绪就好,真实的框架的完成要庞杂一些。
  起首assign,它的功效是为变量赋值,这里我假定传递的参数都是联系关系数组,也就是常说的HashTable,它不该该直接挪用View的接口,这接话柄现怎样赋值:
1 protected  function _assign(Array $arr) { 2         View::assign($arr); 3     }   
  为了处置视图这一块的数据存储和展现,我界说了View.php这个文件,View::assign这个办法是它的一个静态办法,固然,完成的功效人人都懂的。。。
              详细View.php中怎样完成的呢?
1 private static $_data = array(); 2     public static function assign($arr) { 3         foreach($arr as $key => $val) { 4             if(!is_int($key)) { 5                 //过滤失落如array('test','test2')这类数据 6                 self::$_data[$key] = $val; 7             } 8         } 9     }  因为assign是静态办法,数据又需求存储到这个类,所以需求界说一个静态的成员变量$_data,这个变量存储掌握器传递的数据。由于之前在掌握器的assign中已停止了类型提醒,所以可以包管在View中的assign传递的形参都是数组,如今只需求一个foreach然后顺次存储便可,那为何不直接利用self::$_data = $arr呢,如许只要一句话呢?
  起首,数组中的数据有些多是不合错误的,好比array('test','test2')我就不懂数据test和test2究竟代表了甚么,如许的数据应当在assign中就被剔除失落,假如你请求对照严苛,也能够直接给用户提醒正告。
  其次,有能够用户屡次挪用assign,假如直接利用援用,那末第二次挪用assign就会把第一次的数据弄丢,如许是不成容忍的。
  好,赋值弄定,然后就是怎样显示的成绩了,在掌握器中,仍是直接挪用接口,而不担任外部完成,然而在挪用接口之前需求停止必定的格局化:
01 protected function _display($str) { 02         if(is_string($str)) { 03             $str = str_replace(array( 04                 '.','#' 05             ),array( 06                 '/','.' 07             ),$str); 08             View::display(MODULES_PATH . View::VIEW_BASE_PATH . $str . '.php'); 09         } 10     }  为了视觉上的雅观和其他一些XXX的缘由,咱们可以将暗示途径的/在作为实参传递的时分酿成.,如许假定要挪用test/test2.php,那末只需求传递test.test2.php便可。固然,如许也存在一个成绩,有时分需求利用.,就像方才这个例子,实践上test.test2.php会被解析为test/test2/php,如许实践上是有成绩的,那末怎样处理呢,我利用一个#代表.,如许方才这个传递的时分就酿成了test.test2#php。如许还有一个成绩,.php根基上每一个页面都有,那为何还要传递出来呢,直接框架帮你加上就行了嘛,所以用户只需求输出test.test2就好,如许从逻辑上也轻易了解,test模块上面的test2这个视图文件。假如你用过thinkphp,你会发明这和它的写法很相似,实践上我在最入手下手写的时分就是边看thinkphp源码边写的,所以良多器材都自创了它的思惟。我团体对照厌恶利用#,所以我根基上在视图文件中没有利用过#,由于我感觉你本人不会这么无聊,去写相似于test.view.php如许的有意义的文件名,直接test.php就行了,如许的名字框架又帮你处理了一局部,所以根基上不存在这个成绩了。
  这儿还呈现了一个常量View::VIEW_BASE_PATH,这个常量代表的寄义是视图根目次的途径,如许传递出来的实践上是一个实践的相对途径。
  因为display是展现这个视图文件,那末一定会利用include某一个文件,详细的完成以下:
1 public static function display($file) { 2         if(file_exists($file)) { 3             extract(self::$_data); 4             include $file; 5         } else { 6             throw new ViewException(ViewException::NOT_EXISTS_TEMPLATE); 7         } 8     }  extract就是讲数组打散,更多的请查询PHP手册。
  这里因为能够这个视图文件不存在,所以需求剖断一下,假如视图文件不存在,则直接抛出异常,注重,异常是利用了ViewException,这个类又是新界说的,传递的参数暗示这个异常是由于视图模板不存在而引发的。
  那我么来看看详细这个异常类的完成:
01 <?php 02 class ViewException extends BaseException { 03     const NOT_EXISTS_TEMPLATE = 1; 04     public function __construct($code = 0) { 05         switch($code) { 06             case ViewException::NOT_EXISTS_TEMPLATE: 07                 $msg = 'the template file is not exists'; 08                 break; 09             default : 10                 $msg = 'unknown exception'; 11                 break; 12         } 13         parent::__construct($msg,$code); 14     } 15 }  这个类它承继了BaseException,因为BaseException完成了debug形式开与关分歧情形下展现内容分歧,ViewException也具有这个特征,当debug封闭,抛出异常的时分,也只会跳转到毛病页,不会直接展现异常,如许的处置更容易保护。
会HTML吗?会,我能编好几个大表格排板的网页啦!
作者: admin    时间: 2015-2-20 12:04
写的比较杂,因为我也是个新手,不当至于大家多多指正。
作者: 愤怒的大鸟    时间: 2015-2-21 20:55
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
作者: 深爱那片海    时间: 2015-2-28 19:15
我还是强烈建议自己搭建php环境。因为在搭建的过程中你会遇到一些问题,通过搜索或是看php手册解决问题后,你会更加深刻的理解它们的工作原理,了解到php配置文件中的一些选项设置。
作者: 若相依    时间: 2015-3-10 04:55
说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。
作者: 灵魂腐蚀    时间: 2015-3-17 04:17
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
作者: 老尸    时间: 2015-3-19 15:59
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
作者: 莫相离    时间: 2015-3-28 12:54
本文当是我的笔记啦,遇到的问题随时填充
作者: 若天明    时间: 2015-4-1 09:10
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者: 海妖    时间: 2015-4-9 20:00
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
作者: 因胸联盟    时间: 2015-4-10 01:12
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
作者: 第二个灵魂    时间: 2015-4-14 16:48
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
作者: 谁可相欹    时间: 2015-4-16 00:09
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
作者: 不帅    时间: 2015-4-21 20:49
做为1门年轻的语言,php一直很努力。
作者: 仓酷云    时间: 2015-4-26 01:41
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
作者: 冷月葬花魂    时间: 2015-4-29 17:19
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
作者: 山那边是海    时间: 2015-5-1 19:10
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
作者: 小妖女    时间: 2015-5-6 19:30
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
作者: 只想知道    时间: 2015-6-4 18:10
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
作者: 飘灵儿    时间: 2015-6-11 20:44
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2