zoukankan      html  css  js  c++  java
  • 框架开发(五)----自动加载类

    一 . 为什么自动加载

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

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

      

      

  • 相关阅读:
    基于摸板匹配的目標跟蹤算法
    spoj 2713 Can you answer these queries IV
    zoj 3633 Alice's present
    hdu 3642 Get The Treasury
    poj 1195 Mobile phones
    poj 2760 End of Windless Days
    zoj 3540 Adding New Machine
    spoj 1716 Can you answer these queries III
    spoj 1043 Can you answer these queries I
    spoj 2916 Can you answer these queries V
  • 原文地址:https://www.cnblogs.com/liuyuxing/p/5020017.html
Copyright © 2011-2022 走看看