加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php自动加载机制的深入分析

发布时间:2022-07-06 11:26:12 所属栏目:PHP教程 来源:互联网
导读:php自动加载机制的深入分析 一、php中实现自动加载的方法 1.使用require,include,require_once,include_once手工进行加载。 2.使用__autoload来进行自动加载 3.使用spl的autoload来实现自动加载 手工加载的实现: 当需要加载的文件很少的时候我们可以使用
  php自动加载机制的深入分析
 
  一、php中实现自动加载的方法
  1.使用require,include,require_once,include_once手工进行加载。
  2.使用__autoload来进行自动加载
  3.使用spl的autoload来实现自动加载
  手工加载的实现:
 
  当需要加载的文件很少的时候我们可以使用第一个来完成。这样做很简单也没问题。
 
  复制代码 代码如下:
 
  require_once 'a.php';
  require_once 'b.php';
  require_once 'c.php';
 
  但是当需要加载文件很多的时候这样做还行吗?需要写十个,二十个require_once 或者更多的时候我们该怎么办?
  这个时候我们可以使用__autoload方法来简化我们的代码。
 
  __autoload加载的实现:
  我们在test目录下创建一个in.php文件,内容如下。
 
  复制代码 代码如下:
 
  echo '我是test下面的in.php<br />';
 
  然后在test目录下创建一个loader.php,内容如下。
  复制代码 代码如下:
 
  // 需要重载__autoload方法,自定义包含类文件的路径
  function __autoload($classname)
  {
   $class_file = strtolower($classname).".php";
   if (file_exists($class_file)){
    require_once($class_file);
   }
  }
  @$test = new in(); // 执行到这里会输出 <SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">我是test下面的in.php</SPAN>
 
  没问题,成功了!我们还可以创建其他的文件来进行加载,但是当需要的文件很多需要区分目录的时候怎么办?
  这时我们需要修改loader.php可以使用映射来找到要加载的文件。
 
  复制代码 代码如下:
 
  function __autoload($class_name) {
   $map = array(
    'index' => './include/index.php',
    'in' => './in.php'
   );
      if (file_exists($map[$class_name]) && isset($map[$class_name])) {
          require_once $map[$class_name];
      }
  }
  new index();
 
 
  这种方法的好处就是类名和文件路径只是用一个映射来维护,所以当文件结构改变的时候,不需要修改类名,只需要将映射中对应的项修改就好了。
  但是__autoload在一个项目中只能使用一次,当你的项目引用了别人的一个项目,你的项目中有一个__autoload,别人的项目也有一个__autoload,这样两个__autoload就冲突了.解决的办法就是修改__autoload成为一个,这无疑是非常繁琐的,应用场景单一。
 
  spl的autoload加载实现:
  spl的autoload系列函数使用一个autoload调用堆栈,你可以使用spl_autoload_register注册多个自定义的autoload函数,应用场景广泛
 
  •在test目录下建立in.php,内容如下  
 
  复制代码 代码如下:
 
  <?php
  class in {
   public function index() {
    echo '我是test下面的in.php';
   }
  }
  ?>
 
  在test目录下建立loader.php,内容如下
  复制代码 代码如下:
 
  <?php
  set_include_path("/var/www/test/"); //这里需要将路径放入include
  spl_autoload("in"); //寻找/var/www/test/in.php
  $in = new in();
  $in->index();
 
  •spl_autoload_register将函数注册到SPL __autoload函数栈中,修改loader.php
  复制代码 代码如下:
 
  function AutoLoad($class){
      if($class == 'in'){
          require_once("/var/www/test/in.php");
      }
  }
  spl_autoload_register('AutoLoad');
  $a = new in();
  $a->index();
 
  •spl_autoload_register注册多个自定义的autoload函数的应用
  首先在test目录下建立mods文件夹并建立inmod.mod.php内容如下:
  复制代码 代码如下:
 
  <?php
  class inmod
  {
   function __construct()
   {
    echo '我是mods下的in';
   }
  }
 
  然后在test目录下建立libs文件夹并建立inlib.lib.php内容如下:
  复制代码 代码如下:
 
  <?php
  class inlib
  {
   function __construct()
   {
    echo '我是libs下的in';
   }
  }
 
  最后在test目录下建立loader.php内容如下
  复制代码 代码如下:
 
  <?php
  class Loader {
      /**
      * 自动加载类
      * @param $class 类名
      */
      public static function mods($class) {
          if($class){
     set_include_path( "/var/www/test/mods/" );
     spl_autoload_extensions( ".mod.php" );
     spl_autoload( strtolower($class) );
          }
      }
      public static function libs($class) {
    if($class){
     set_include_path( "/var/www/test/libs/" );
     spl_autoload_extensions( ".lib.php" );
     spl_autoload( strtolower($class) );
          }
      }
  }
  spl_autoload_register(array('Loader', 'mods'));
  spl_autoload_register(array('Loader', 'libs'));
  new inmod();//输出<SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 14px">我是mods下的in</SPAN>
  new inlib();//<SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">输出</SPAN><SPAN style="FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 14px">我是libs下的in</SPAN>

(编辑:衡阳站长网)

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

    热点阅读