Code前端首页关于Code前端联系我们

autoload机制:使用PHP autoload

terry 2年前 (2023-09-25) 阅读数 48 #后端开发

在介绍autoload机制之前,如果要引用其他文件中的函数和类,必须使用include/require来加载该文件。由于 SPL 库的自动加载机制和命名空间的改进,在现代 PHP 开发中很少看到通过 include/require 方法加载的类。

使用 require/include 加载类的方法很简单:包含类定义所在的文件,类定义自然就在那里。在较大的项目中,这种方法将导致在每个 PHP 文件的开头进行大量包含/要求。如果某些文件中定义了全局常量,则会不时出现有关重复定义的警告。如果您使用的是第三方类库,还必须了解该库的结构才能正确导入文件。正如您所看到的,以这种方式加载类效率低下且乏味。

PHP5 引入了 __autoload 函数来简化类加载。如果函数定义不存在,则始终调用该函数。开发者可以使用该函数来加载类文件,例如:

function __autoload($classname){    require_once("{$classname}.php")}

不过,该函数在 PHP7.2 中已被弃用和弃用。废弃的原因是PHP不允许函数重名,所以一个项目中只能出现一个__autoload函数。虽然要确保自己编写的代码中只有一个 __autoload 函数有点困难,但还是可以做到的。如果第三方库也定义了__autoload,那就很头疼了。 __autoload 的后继者是 spl_autoload_register 函数,它是一个强大的 PHP 工具,用于处理自动类加载。

spl_auoload_register 函数参数是一个回调函数。调用此函数会将注册的加载函数排入自动加载函数队列。当找不到类定义时,Zend 引擎将依次回调排队的函数,直到找到类定义或抛出未定义的类异常。使用 spl_autoload_register 时值得注意的几点:

  1. 理论上可以注册无限个加载函数,相比之下,__autoload 只能定义一次;
  2. PHP 引擎会依次调用注册的函数。为了效率,最常用的类的加载函数应该放在顺序的最前面;注册的函数
  3. spl_autoload_register是PHP给开发者帮助找到类的最后机会,否则会直接抛出异常。new、静态调用和class_exists操作可以触发对已注册加载器函数的调用;
  4. spl_autoload_register 通常与 PSR-4 规范结合使用,实现高效且优雅。

使用spl_autoload_register,程序中不再有很多包含/需要的项目,而是使用。有些人可能认为使用多个用法并不一定比使用多个请求/内容更方便。其实using的优点如下:

  1. 同一命名空间下的类不需要通过using导入;
  2. 在PHP7中,可以分组引入类,比如使用app\utils{ A, B, C},这样可以节省行数,也方便;
  3. use可以为类设置别名,避免名称相似造成的错误;
  4. 使用use,不需要考虑绝对路径、相对路径等,一切都交给注册加载函数的处理。

有了spl_autoload_register,面向对象的PHP编程更加完整和优雅,也让PHP以更现代的方式工作。

除了 spl_autoload_register 之外,spl_autoload 函数系列还包括 spl_autoload_call/spl_autoload_extensions/spl_autoload_functions/spl_autoload_unregister。这些函数在一般程序开发中很少使用,但在类库开发中可以使用。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门