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来剖断。
建议大家买一本书,而不光是在网上看一些零碎的资料,一本书毕竟会讲的系统一些,全面一些,而且印刷的书不受电脑的限制,但是建议在看书的时候最好旁边有电脑,这样可以很及时地上机实践。 首推的搜索引擎当然是Google大神,其次我比较喜欢 百度知道。不过搜出来的结果往往都是 大家copy来copy去的,运气的的概率很大。 因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax 个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。 本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。 当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标, 本文当是我的笔记啦,遇到的问题随时填充 微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。 在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。 开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。 对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。 爱上php,他也会爱上你。 遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。 我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能: 基础有没有对学习php没有太大区别,关键是兴趣。 再就是混迹于论坛啦,咱们的phpchina的论坛就很强大,提出的问题一般都是有达人去解答的,以前的帖子也要多看看也能学到不少前辈们的经验。别的不错的论坛例如php100,javaeye也是很不错的。 学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。 我学习了一段时间后,我发现效果并不好(估计是我自身的问题)。因为一个人的精力总是有限的,同时学习这么多,会导致每个的学习时间都得不到保证。 其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎 小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。
页:
[1]
2