理解 Composer 自动加载——spl_autoload_register ()

  概念

  spl_autoload_register() 可以注册任意数量的自动加载器,当尚未被定义的类(class)和接口(interface)被使用时,脚本引擎会尝试在PHP出错之前通过自动加载器来加载所需要的类。

  使用形式

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

  参数

callable $autoload_function

  欲注册自动装载函数。可以是方法名、闭包函数。如果想要使用到类中的静态方法,可以使用如下形式方法注册:

//  数组中第一个元素为类名,第二个元素为该类的静态方法名
$autoload_function = ['YourClass', 'yourStaticFunction'];

  如果我们在程序中已经实现了 __autoload() 方法,它必须被显式注册到 __autoload() 队列中。因为 spl_autoload_register() 函数会将Zend Engine中的 __autoload() 函数取代为 spl_autoload()spl_autoload_call()(一般情况下我们不会实现 __autoload() 方法,而是统一把 spl_autoload_register() 作为自动加载的最佳实践)

bool $throw = true

  当 $autoload_function 出现错误时,是否抛出异常。

bool $prepend = false

  若该值为 true ,表示会将注册的函数 $autoload_function 放入队列首部;若值为 false ,则放入队列尾部。

  相关函数

__autoload(string $class)

  尝试加载未定义的类时,会自动执行该方法。(缺点,只能使用一次,所以一般使用 spl_autoload_register()

spl_autoload(string $class_name, string $file_extensions)

  类加载的默认实现。若不使用任何参数调用 spl_autoload_register() ,则以后再进行 __autoload() 调用时自动使用此函数。(相当于替代了 require / include

  注意在使用时需要配合以下函数:

   spl_autoload_extensions() :注册并返回 spl_autoload() 函数使用的默认文件扩展名。

   set_include_path() :设置 include_path 配置选项。

  案例如下:

function autoload($className) {
    set_include_path('./library/classes/');
    spl_autoload($className); //replaces include/require
}

spl_autoload_extensions('.class.php');
spl_autoload_register('autoload');

  个人理解

  大致过程如下:

  1. 通过 spl_autoload_function() 注册函数,将函数插入到队列尾部。(若指定第三个参数为 true ,则为插入至队首)

  2. 每次实现一个类或接口,脚本引擎会从首到尾依次执行队列里边注册好的函数,直到找到为止。若某个函数执行后能够找到该类或接口,则后续的函数不会再执行。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!