|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
会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来剖断。
建议大家买一本书,而不光是在网上看一些零碎的资料,一本书毕竟会讲的系统一些,全面一些,而且印刷的书不受电脑的限制,但是建议在看书的时候最好旁边有电脑,这样可以很及时地上机实践。 |
|