• 框架开发(五)----自动加载类


    一 . 为什么自动加载

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

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

      

      

  • 相关阅读:
    蛙蛙推荐:改进了一个DBAccess类,顺便说说啥是线程安全
    蛙蛙推荐:SQLServer优化资料整理
    快速配置Eclipse3.1.1+Tomcat5.0+Lomboz dodo
    建立asp.net应用程序提示:无法与服务器建立连接 dodo
    tomcat连接sqlserver配置 dodo
    如何让DNN页面中的html控件中的文本项显示为中文? dodo
    DropDownList 不能有多个项被选定 dodo
    转换DATAREADER为 dataset dodo
    使用ComponentArt.WebUI.for.Asp.net.3.0的TreeView控件 dodo
    ASP.NET的WEB项目不能添加WEB用户控件的解决 dodo
  • 原文地址:https://www.cnblogs.com/liuyuxing/p/5020017.html
Copyright © 2020-2023  润新知