首页 > 编程 > PHP > 正文

PHP自动加载机制

2020-03-22 16:28:51
字体:
来源:转载
供稿:网友
  • 3种加载文件的方法:
    使用require,include,require_once,include_once手工进行加载。
    使用__autoload来进行自动加载
    使用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($html' target='_blank'>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函数,应用场景广泛

    spl的自动加载的相关函数
    spl_autoload 是_autoload()的默认实现,它会去include_path中寻找$class_name(.php/.inc) Spl_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>

    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表