zoukankan      html  css  js  c++  java
  • PHP的自动加载autoload和spl_autoload_register

    一、自动加载的实现

    1、___autoload()

    PHP早期支持的版本。如果你需要实现自动加载,可以通过定义这个函数来启用。如下:

    function __autoload($class){
       $className = strtolower($class);
       $path = './includes/'.$className.".php";
        if(file_exists($path)){
             require_once($path);
        }else{
            die("the file {$className} could not be found");      
        }
    }

    这样就会自动加载当前目录的 includes 下的文件了。

    类似用法经常在私人项目,或者说是单一项目的框架中见到,为什么呢?因为你只能定义一个__autoload 函数,在多人开发中做不到不同的开发者使用不同的自定义的autoloader,除非大家都提前说好了,都使用一个__autoload,涉及到改动了就进行版本同步,这很麻烦。

    2.spl_autoload_register()
    于是,为了解决上面的问题,在PHP的5.3版本,引入了spl_autoload_register
    不再是让你只能定义一个函数了。是官方定义的好的函数,你只需要调用它,把你的加载逻辑写在它的匿名函数即可。

    使用方法如下:


    spl_autoload_register(function($className){
        $name = strtolower($className);
        $path= "./includes/{$name}.php";
    
        if(file_exists($path)){
            require_once($path);
        }else{
            die("the file {$className} could not be found");
        }
    });

    2、spl_autoload_register() 调用静态方法

    class test {
     public static function loadprint( $class ) {
      $file = $class . '.class.php';  
      if (is_file($file)) {  
       require_once($file);  
      } 
     }
    } 
     
    spl_autoload_register(  array('test','loadprint')  );
    //另一种写法:spl_autoload_register(  "test::loadprint"  );

    二、自动加载的优点

    自动加载不同于requireinclude。autoload机制是lazy loading。即是并不是你一运行就给你调用所有的文件,而是只有你用到了哪个,比如说new了哪个文件以后,才会通过autoload机制去加载相应文件。
    为了提高程序的性能,很多大型的框架都是使用这种加载方式。比如laravel中就大量使用这个方式。

    三、__autoload和spl_autoload_register的区别

    __autoload只能定义一个,当多个框架或者多人开发时,容易造成报 __autoload 重复定义的出错。spl_autoload_register不一定,可以写多个,没有限制

    作者:houxin
    链接:https://www.jianshu.com/p/02ccdd39e90a
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    关于WebBrowser(浏览器)控件的调用
    SQLite3.0 beta & ADO.NET Data Provider for SQLite 0.18发布了!
    特别推荐:纯VB.NET代码直接生成Excel文件(不需要Excel)
    关于ASP.NET中独立页面设置身份认证等问题
    关于实时网站资源监控
    关于SQLite.org网站给黑...
    .NET中调用COM的一些问题
    关于数据库空字段和DEFAULT值等问题
    关于软件保护的矛与盾
    (转贴) 微软面试100题——要想成为盖茨就来试试!
  • 原文地址:https://www.cnblogs.com/zhangzhijian/p/14575728.html
Copyright © 2011-2022 走看看