1. 什么是自动加载
自动加载是 PHP 5 中的新特性,它可以在需要的时候自动地加载类或接口文件,而不必手动引入它们。在老版本的 PHP 中,如果需要使用某个类,往往需要使用 include 或 require 函数来引入这个类文件。这种方式存在很大的弊端:
需要手动维护全部的类引入
会有很多重复的引入,会导致性能问题
会有命名空间的冲突问题
因此,自动加载的出现可以减轻开发人员的工作,提高代码的可维护性与可读性。
2. 自动加载实现方式
PHP 提供了实现自动加载的 2 个函数:spl_autoload_register 和 *__autoload。这里讲解使用 spl_autoload_register 完成自动加载。
2.1 spl_autoload_register 函数
spl_autoload_register 函数是 PHP5 中实现自动加载的主要函数,它接受一个参数:函数名或数组,用来注册一个自动加载函数。
spl_autoload_register('my_autoload');
上面的代码注册了 my_autoload 函数作为自动加载函数。如果某个类被调用,但是在当前命名空间下没有找到,PHP 就会自动调用 my_autoload 函数来解决这个问题。
2.2 实现自动加载的 my_autoload 函数
my_autoload 函数需要接受一个参数:类名。当 PHP 需要使用这个类的时候,会以类名作为参数传递给 my_autoload 函数。my_autoload 函数需要根据类名来自动加载相应的类文件。以下是一种可能的实现方式:
function my_autoload($classname) {
$path = str_replace('\\', DIRECTORY_SEPARATOR, $classname);
$file = __DIR__ . '/' . $path . '.php';
if (file_exists($file)) {
require_once($file);
}
}
spl_autoload_register('my_autoload');
上面的代码使用了 str_replace 函数将命名空间转换为目录,然后使用 require_once 函数自动加载相应的类文件。
3. 自动加载实例
下面是一个使用自动加载的实例。假设有一个名为 Person 的类,存储在 /app/models/Person.php 文件中。此时,如果想在某个文件中使用 Person 类,只需要使用如下代码即可:
use app\models\Person;
$person = new Person();
在这个例子中,PHP 会自动加载 /app/models/Person.php 文件,并且使用 Person 类创建一个新对象。这种方式大大减轻了开发人员的工作,也提高了代码的可读性和可维护性。