AImager

自动加载主要有两个功能,一是无需事先引入类文件,而是在使用的时候发生类引用错误自动引入相关类文件;二是通过极少的代码,使项目在运行时自动载入大量的类文件,以替代重复的require/include编码。这里主要介绍的是PHP5开始使用的自动加载类,虽然__autoload函数也可以使用,但是在7.2.0版本已经被反对使用了。以下为常用的自动加载类函数

spl_autoload_register([ callable $autoload_function
        [, bool $throw = true
        [, bool $prepend = false ]]])

spl_autoload(string $class_name
        [, string $file_extensions = spl_autoload_extensions() ])

spl_autoload_extensions([string $file_extensions])

spl_autoload_call(string $class_name)

spl_autoload_functions()

spl_autoload_unregister(mixed $autoload_function)

spl_autoload_register用来取消__autoload函数,同时将$autoload_function加入到__autoload队列中,一旦出现类引用错误就依次调用__autoload队列中的函数,直到所需要的类可用为止(此时队列中剩下的函数将不再执行)。参数$autoload_function表示可选的回调函数,当参数为空的时候会将__autoload函数的默认实现spl_autoload(~)加入到__autoload队列中去。实际测试后发现支持简单函数和静态类方法,可以以字符串形式和数组形式传入,如functionclass::functionarray(class,function),后两种均表示静态方法。参数$throw指无法注册时是否抛出异常。参数$prepend指是否将函数加入到队首,默认为队尾。

spl_autoload用来在当前目录下寻找并引入以$file_extensions子串作为文件扩展名、$class_name作为文件前缀名的文件,需要注意的是这个函数并不支持重写,但可以直接调用。

spl_autoload_extensions用来设置自动加载文件的扩展名,在参数为空时的默认返回值为”.php,.ini”。

spl_autoload_call(~)用来调用__autoload队列中的函数立即引入类文件,避免在类引用的时候才调入类文件。

spl_autoload_functions(~)返回__autoload队列中的所有函数组成的数组。

spl_autoload_unregister(~)用于注销__autoload队列中的函数。

demo

  // ./test/main.php

  //set_include_path("dir".PATH_SEPARATOR.get_include_path());
  //echo get_include_path();

  function loadPHP($class_name){
    if(file_exists("$class_name.php")){
      include_once $class_name.'.php';
    }
    echo "PHP \n";
  }

  function loadINI($class_name){
    if(file_exists("$class_name.ini")){
      include_once $class_name.'.ini';
    }
    echo "INI \n";
  }

  spl_autoload_register('loadPHP');
  spl_autoload_register('loadINI');

  $a = new test1();

  // spl_autoload_call("test1");
  // spl_autoload_extensions(".php,.ini,.txt");
  // spl_autoload_unregister('loadPHP');



  // ./test/test1.ini

  class test1{ };
  echo "include test1 \n";