PHP教程

PHP类的自动加载

一、概念

在编写面向对象(OOP) 程序时,很多开发者为每个类新建一个 PHP 文件,但是每个脚本的开头,都需要包含(include)一个长长的列表(每个类都有个文件)。为了解决这个烦恼,spl_autoload_register() 函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载。

通过注册自动加载器,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。像 class 一样的结构都可以以相同方式自动加载。包括类、接口、trait 和枚举等。

二、自动加载类的好处

总结起来,自动加载功能带来了几个好处:

1、使用类之前无需 include 或者 require;

2、使用类的时候才会 require/include 文件,实现了 lazy loading,避免了 require/include 多余文件;

3、无需考虑引入类的实际磁盘地址,实现了逻辑和实体文件的分离。

三、 实现自动加载

本例尝试分别从 MyClass1.php 和 MyClass2.php 文件中加载 MyClass1 和 MyClass2 类。

<?php
spl_autoload_register(function ($class_name) {
require_once $class_name . '.php';
});

$obj = new MyClass1();
$obj2 = new MyClass2();
?>

四、加载接口ITest

<?php

spl_autoload_register(function ($name) {
var_dump($name);
});

class Foo implements ITest {
}

/*
string(5) "ITest"

Fatal error: Interface 'ITest' not found in ...
*/
?>

五、注意

PHP 8.0.0 之前,可以使用 __autoload() 自动加载类和接口,但由于它是 spl_autoload_register() 的一种不太灵活的替代方法,并且 __autoload() 在 PHP 7.2.0 起弃用,所以在 PHP 8.0.0 起移除。

spl_autoload_register() 可以多次调用以便注册多个自动加载器,但从自动加载函数中抛出异常会中断该过程并且禁止继续执行,所以建议不要从自动加载函数中抛出异常。

广告合作
QQ群号:707632017

温馨提示:

1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com。(#改为@)

2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。

目录