一 . 为什么自动加载

  自动加载字面的意思就不解释了.我这里自动加载类解析下 是自动加载类文件的意思.__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缓存类.

本站博客皆为原创,转载请标明出处. 小三爷在此谢过了~~~!

 

 

  

 

 

  

posted on 2015-12-04 17:27  任城三爷  阅读(236)  评论(0编辑  收藏  举报