一 . 为什么自动加载
自动加载字面的意思就不解释了.我这里自动加载类解析下 是自动加载类文件的意思.__autoload方法完全可行,但是不要问为什么,还是用spl_autoload_register.不只是灵活,而且就是灵活,还是灵活,体现在__autoload只能这么命名,spl_auto_register() 能调用不同的函数.
二 自动加载函数原理
通常情况下,一个类的定义都是一个文件,当类与类需要相互引用的时候,就需要include(require)相应的类文件,带来的问题就是每次需要用到某个类的时候就需要手工去include(require).php5 之后已经有了类的自动加载机制,在new 某个类的时候,如果未定义,会在抛出错误之前check __autoload 加载需要的类.__autoload 是php的原生函数,spl_auto_register 是PHP 的 C 扩展函数.php和python是编译成C才可以运行的脚本.
**SPL standard PHP Library.
**传说在php 的源码里,spl_auto_load 直接操作了指针,所以这个之后__autoload 就没有用了.spl_auto_load 优先级比__autoload高.
三 伪码
为了偷懒,设计自动加载函数 ,取后缀名Model,Action,Class, 分别代表数据库操作类,响应前台的操作类,第三方引入lib类
四 实现
方法放在common.php 里
1 /** 2 * @ 自动加载函数使用 3 * @ 各种model函数,Class 函数命名规则 4 * @ 命名规则必须是xxL(l)ibry || xxC(c)lass || xxM(m)odel 5 * @ author yuxing@sina.book.com 6 */ 7 function my_autoload($class=null){ 8 // var_dump($class);exit(); 9 $str = $class; 10 $ext = substr($str,-5); 11 // var_dump($ext); 12 $name =substr($class,0,-5); 13 // var_dump($name);exit; 14 $ext = ucfirst(strtolower($ext)); 15 // var_dump($name);exit(); 16 // var_dump($ext);var_dump($name);exit(); 17 switch ($ext){ 18 case 'Class'; //对应前台的操作类 19 // echo APP_PATH.'Controller'.DIRECTORY_SEPARATOR.$name.$ext.EXT; 20 // exit(); 21 if(!file_exists(APP_PATH.'Controller'.DIRECTORY_SEPARATOR.$name.$ext.EXT)){ 22 exit('Class文件不存在'); 23 }else{; 24 require_once(APP_PATH.'Controller'.DIRECTORY_SEPARATOR.$name.$ext.EXT); 25 } 26 break; 27 case 'Model': //对应数据库的操作类 28 if(!file_exists(APP_PATH.'Model'.DIRECTORY_SEPARATOR.$name.$ext.EXT)){ 29 exit('Model文件不存在'); 30 }else{ 31 require_once(APP_PATH.'Model'.DIRECTORY_SEPARATOR.$name.$ext.EXT); 32 } 33 break; 34 case 'Libry'; //对应第三方操作类 35 if(!file_exists(APP_PATH.'Libry'.DIRECTORY_SEPARATOR.$name.$ext.EXT)){ 36 exit('库文件不存在'); 37 }else{ 38 require_once(APP_PATH.'Libry'.DIRECTORY_SEPARATOR.$name.$ext.EXT); 39 } 40 break; 41 default: //没有匹配到的项 42 if(!file_exists(APP_PATH.'Controller'.DIRECTORY_SEPARATOR.$class.EXT)){ 44 45 exit('Class文件不存在'); 46 }else{ 48 require_once(APP_PATH.'Controller'.DIRECTORY_SEPARATOR.$class.EXT); 49 } 50 break; 51 }
函数写完,在框架里第一次new 之前调用下.
我的代码是在sina_router.php
1 spl_autoload_register('my_autoload');
准备工作完毕.
在controller里面调用一下吧
1 public function result(){ 2 $obj = new PageLibry(); 3 var_dump($obj); 4 }
浏览器效果如下.
that's all .
下一篇是缓存类.memcache缓存类.
本站博客皆为原创,转载请标明出处. 小三爷在此谢过了~~~!