海妖 发表于 2015-2-3 23:29:26

PHP教程之一步步编写PHP的Framework(四)

会PHP吗?会,我会把一加一的运算写在函数里,然后调用啦!   
上一篇文章我提了一个成绩,怎样完成主动载入一个类呢?
实践上PHP已有响应的机制可以完成这个功效了,这个机制就是autoload,它会在试图利用还没有被界说的类时主动挪用。
如今咱们可以在Route.php中的开首界说autoload函数(固然,如许是不标准的,然而为了复杂,先这么做)。
咱们如今的主动导入需求导入两类文件,一类是框架类文件,别的一类是用户使用模块的类文件,为了简化代码,可以假定框架的一切文件都寄存在/Library/Test目次上面,用户类文件都寄存在/UserApps/Modules目次上面,而且只会在Controllers,Models,Helpers这三个目次上面,而且这几个目次上面没有子目次。
关于这个主动导入的函数,它需求起首测验考试导入框架类文件,假如该文件不存在,申明是用户类文件,然后再测验考试导入用户类文件,假如是,那末include它。
注重:
因为要频仍利用UserApps/Modules这个目次,所以我界说了一个MODULES_PATH这个常量;
01 function __autoload($className) { 02   $frameworkFileName = FRAMEWORK_PATH . '/' . $className . '.php'; 03   if(is_file($frameworkFileName)) { 04         include $frameworkFileName; 05   } else { 06         //用户类文件 07         $controllerFileName = MODULES_PATH . '/Controllers/' . $className . '.php'; 08         if(is_file($controllerFileName)) { 09             include $controllerFileName; 10         } else { 11             $modelFileName = MODULES_PATH . '/Models/' . $className . '.php'; 12             if(is_file($modelFileName)) { 13               include $modelFileName; 14             } else { 15               $helperFileName = MODULES_PATH . '/Helpers/' . $className . '.php'; 16               if(is_file($helperFileName)) { 17                     include $helperFileName; 18               } else { 19                     throw new Exception("class not found"); 20               } 21             } 22         } 23   } 24 }             当你把这个函数写完以后,可以在之前已写好的IndexController.php中去测试一下,好比在和IndexController统一目次上面创立一个文件Test.php,文件代码以下:
1 <?php 2 class Test { 3       public function test() { 4          echo 'Test'; 5       } 6 }然后在IndexController.php中利用以下:
1 <?php 2 class IndexController { 3   public function index() { 4         $test = new Test(); 5               $test->test(); 6   } 7 }假如呈现Test,那末祝贺你,主动导入胜利了!!
   
如今再思索一下,假如针对一个很庞杂的项目,利用这类体例来主动导入,有甚么成绩吗?
其实成绩是对照严重的,起首关于框架的文件,咱们不成能将一切文件都寄存在一个目次上面,如许当文件多了以后就检索就费事了;关于用户类文件,好比掌握器的文件,咱们不成能将它全体寄存在一个目次上面,咱们需求依照模块切分目次等。假如用__autoload来完成的话,这个函数的代码量就太大了,并且假如有一个中央的修正那末便可能牵一发而动全身,如许关于项目标保护是很晦气的。
那末咱们怎样处理这个成绩呢?
办法一:
咱们界说良多帮助函数,好比导入框架文件,咱们界说一个frameworkAutoloadHelper,关于用户文件界说一个userAutoloadHelper,然后将营业逻辑寄存在这两个函数中,最初在__autoload中挪用这两个函数便可,当用户功效需求修正的时分,代码保护性就好一些了;
办法2:
在SPL中已界说了一个spl_autoload_register,可使用这个来说主动导入的功效分摊到多个类中,并且还可以将主动导入的掌握权交给用户,这关于框架来讲是对照主要的,所以,我保举利用这类体例。
详细这类体例怎样完成,读者可以本人查查PHP手册。
当咱们利用了spl_autoload_register以后,是否是一切就万事大吉了?
其实不是,咱们如今可以想一下是不是可以去除主动导入呢,由于当营业逻辑很庞杂而且主动导入设计的又不是出格好的时分,主动导入的效力就不是很高了!!
不必主动导入,岂非仍是利用include?No。
人人都晓得include,include_once,require,require_once的区分吧!!
include和require每次挪用城市包括这个文件,include_once和require_once只会导入一次,include假如包括了一个不存在的文件,只会抛出正告,法式会持续履行,而require会中断履行,所以这四个函数我对照建议利用require_once,然而很遗憾,这个函数效力很低,由于它要思索的器材太多了!!
PS:利用这四个函数的时分,最好利用相对途径,如许效力要高一些;
假如咱们利用require,那末效力会高良多,然而假如利用require怎样完成require_once的功效呢?
我给人人供应一个思绪,利用static变量:
1 <?php 2 function testRequireOnce($file) { 3       static $_config = array(); 4       if(!isset($_config[$file])) { 5          require $file; 6          $_config[$file] = $file; 7       } 8 }   
固然,还可使用class_exists来剖断。
建议大家买一本书,而不光是在网上看一些零碎的资料,一本书毕竟会讲的系统一些,全面一些,而且印刷的书不受电脑的限制,但是建议在看书的时候最好旁边有电脑,这样可以很及时地上机实践。

金色的骷髅 发表于 2015-2-3 23:39:59

首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。

admin 发表于 2015-2-6 21:29:30

因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax

愤怒的大鸟 发表于 2015-2-18 15:51:13

个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。

因胸联盟 发表于 2015-3-6 08:33:42

本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。

乐观 发表于 2015-3-12 22:33:48

当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,

活着的死人 发表于 2015-3-14 10:42:39

本文当是我的笔记啦,遇到的问题随时填充

海妖 发表于 2015-3-19 16:00:23

微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。

小妖女 发表于 2015-3-28 14:45:30

在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。

再现理想 发表于 2015-4-1 14:50:06

开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。

山那边是海 发表于 2015-4-1 18:31:39

对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。

第二个灵魂 发表于 2015-4-9 16:00:42

爱上php,他也会爱上你。

蒙在股里 发表于 2015-4-12 18:24:30

遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。

透明 发表于 2015-4-15 01:49:43

我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:

仓酷云 发表于 2015-4-21 05:47:58

基础有没有对学习php没有太大区别,关键是兴趣。

小魔女 发表于 2015-4-21 07:57:52

再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。

谁可相欹 发表于 2015-6-12 03:37:26

学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。

莫相离 发表于 2015-6-13 21:52:00

我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。

只想知道 发表于 2015-6-16 23:33:31

其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎

飘灵儿 发表于 2015-7-6 00:53:54

小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
页: [1] 2
查看完整版本: PHP教程之一步步编写PHP的Framework(四)