加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP中的自动加载操作实现方法分析

发布时间:2022-06-30 14:24:28 所属栏目:PHP教程 来源:互联网
导读:本文实例讲述了PHP中的自动加载操作实现方法。分享给大家供大家参考,具体如下: what is 自动加载? 或许你已经对自动加载有所了解。简单描述一下:自动加载就是我们在new一个class的时候,不需要手动去写require来导入这个class.php文件,程序自动帮我们加
  本文实例讲述了PHP中的自动加载操作实现方法。分享给大家供大家参考,具体如下:
 
  what is 自动加载?
 
  或许你已经对自动加载有所了解。简单描述一下:自动加载就是我们在new一个class的时候,不需要手动去写require来导入这个class.php文件,程序自动帮我们加载导入进来。这是php5.1.2(好像是)版本新加入一个功能,他解放了程序员的双手,不需要手动写那么多的require,变得有那么点智能的感觉。
 
  自动加载可以说是现代PHP框架的根基,任何牛逼的框架或者架构都会用到它,它发明出来的理由是啥呢?一个字:懒。因为项目越来愈大,相关联的类库文件越来越多,我们不可能再像小项目那样在一个文件中全部手动一个一个require。
 
  如何才能自动加载呢? PHP 5.2版本更新了自动加载需要的一个魔术方法——__autoload($class_name)
 
  正是这个神奇的内置魔术函数,才能让我们这些屌丝偷懒。我们来看下这个如何使用它。
 
  1. 自动加载的原理以及__autoload的使用
 
  自动加载的原理,就是在我们new一个class的时候,PHP系统如果找不到你这个类,就会去自动调用本文件中的__autoload($class_name)方法,我们new的这个class_name 就成为这个方法的参数。所以我们就可以在这个方法中根据我们需要new class_name的各种判断和划分就去require对应的路径类文件,从而实现自动加载。
 
  我们先一步步来,看下__autoload()的自动调用,看个例子:
 
  index.php
 
  $db =new DB();
 
  如果我们不手动导入DB类,程序可能会报错,说找不到这个类:
 
  Fatal error: Class 'DB' not found in D:wampwwwtestphpautoloadindex.php on line 3
 
  那么,我们现在加入__autoload()这个方法再看看:
 
  $db =new DB();
 
  function __autoload($className)
 
  {
 
    echo $className;
 
    exit();
 
  }
 
  根据上面自动加载机制的描述,你分析下会输出什么? 没错:肯定是输出:DB, 也就是我们需要new 的类的类名。所以,这个时候我们就可以在__autoload()方法里,根据需要去加载类库文件了。
 
  index.php
 
  $db =new DB();
 
  function __autoload($className)
 
  {
 
    require $className .'.php';
 
  }
 
  DB.php
 
  class DB
 
  {
 
    publicfunction __construct()
 
    {
 
        echo 'Hello DB';
 
    }
 
  }
 
  这样子我们就很轻松的将我们需要new 的class 全部导入了进来,这样子,我们就可以轻松的new N个class,比如:
 
  <?php
 
  function __autoload($className)
 
  {
 
    require $className .'.php';
 
  }
 
  $db =new DB();
 
  $info =newInfo();
 
  $gender =newGender();
 
  $name =newName();
 
  //也是支持静态方法直接调用的
 
  Height::test();
   
  先看下它如何使用吧:
 
  当我们去new一个找不到的class时,PHP就会去自动调用sql_autoload_resister注册的函数,这个函数通过它的参数传进去:
 
  sql_autoload_resister($param) 这个参数可以有多种形式:
 
  sql_autoload_resister('load_function'); //函数名
 
  sql_autoload_resister(array('load_object', 'load_function')); //类和静态方法
 
  sql_autoload_resister('load_object::load_function'); //类和方法的静态调用
 
  //php 5.3之后,也可以像这样支持匿名函数了。
 
  spl_autoload_register(function($className){
 
    if (is_file('./lib/' . $className . '.php')) {
 
      require './lib/' . $className . '.php';
 
    }
 
  });
 
  index.php
 
  function load1($className)
 
  {
 
    echo 1;
 
    require $className .'.php';
 
  }
 
  spl_autoload_register('load1');//将load1函数注册到自动加载队列中。
 
  $db =new DB();//找不到DB类,就会自动去调用刚注册的load1函数了
 
  上面就是实现了自动加载的方式,我们同样也可以用类加载的方式调用,但是必须是static方法:
 
  class autoloading {
 
  //必须是静态方法,不然报错
 
    public static function load($className)
 
    {
 
      require $className .'.php';
 
    }
 
  }
 
  //2种方法都可以
 
  spl_autoload_register(array('autoloading','load'));
 
  spl_autoload_register('autoloading::load');
 
  $db =new DB();//会自动找到
 
  需要注意的是,如果你同时使用spl_autoload_register和__autoload,__autoload会失效!!! 再说了,本来就是替换它的,就一心使用spl_autoload_register就好了。
 
   
    if(is_file($className .'.php')){
 
      require $className .'.php';
 
    }
 
  }
 
  function load2($className)
 
  {
 
    echo 2;
 
    if(is_file('./app/'. $className .'.php')){
 
      require'./app/'. $className .'.php';
 
    }
 
  }
 
  function __autoload($className)
 
  {
 
    echo 3;
 
    if(is_file('./lib/'. $className .'.php')){
 
      require'./lib/'. $className .'.php';
 
    }
 
  }
 
  //注册了3个
 
  spl_autoload_register('load1');
 
  spl_autoload_register('load2');
 
  spl_autoload_register('__autoload');
 
   
  123Hello Info
 
  我们分析下:
 
  new DB的时候,就按照注册顺序,先去找load1()函数了,发现找到了,就停止了,所以输出1 Hello Word
 
  new Info的时候,先是安装注册顺序,先找load1(), 所以输出了1,发现没找到,就去load2()里面去找,所以输出了2,还是没这个文件,就去__autoload()函数里找,所以,先输出了3,再输出Hello Info
 
  注意,前面说过,spl_autoload_register使用时,__autoload会无效,有时候,我们希望它继续有效,就可以也将它注册进来,就可以继续使用。
 

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读