共计 1264 个字符,预计需要花费 4 分钟才能阅读完成。
什么是自动加载
自动加载是指在你想使用某个类,但你没有 require 对应的.php 文件的时候,程序帮你自动加载了 php 文件。(require 是件很痛苦的事情 OvO)在没有自动加载之前,你的代码可能是如下这样的:
<?php
require “app/Database.php”;
require “app/Models/User.php”;
require “config/app.php”;
……
$user = new Database();
$user = new User();
引入了好多的 require,随着项目的不断迭代,会很乱。这样的设计并不好。php5.3 之后,实现了自动加载,可以通过 spl_autoload_register()方法进行 php 文件的的自动引入。spl_autoload_register()有三个参数。
spl_autoload_register(‘autoload1’,true,true); 第一个参数是当需要创建的类不存在时,调用 autoload1()这个方法。第二个参数为 true 时,当类的自动加载函数无法成功注册时会抛出异常。第三个参数为 true 时,spl_autoload_register()方法会添加类的自动加载函数到队列之首,而不是队列尾部。
因此,我们最后的代码会是这样:
define(‘BASEDIR’, __DIR__);
public static function autoload($class)
{
require BASEDIR . ‘/’ . str_replace(‘\\’, ‘/’, $class) . ‘.php’;
}
spl_autoload_register(‘autoload’);
$operation = new IMooc\Operation(10);
执行过程
首先定义了一个常量为 BASEDIR 为当前的目录(根目录),(1)当程序执行到 $operation = new IMoocOperation(10); 时,php 引擎就会搜索作用域下是否有 IMoocOperation 这个类,如果有,则正常引入,如果没有则 (2) 调用 spl_autoload_register()方法,然后再执行 (3)autoload 方法,autoload 的参数 $class 为文件路径,根据 psr- 4 规范,文件名要与类名相互对应,(也就是说,User.php 文件只能有一个 class,而且 class 名字必须是 User),所以你在引入了 php 文件后,相当于引入了这个类,就可以调用相应的方法了。antuoload() 在这个例子中被解析为
public static function autoload($class)
{
require‘imooc/IMooc/Operation.php’;
}
引入了这个类,自然就可以使用 new Operation()对象。也就是说,只要你的代码符合 psr- 4 规范,不需要 require 就可以自动加载相应的类。想象一下,你并不需要引入对应的类就可以直接使用,这很棒。如果本文对你有帮助,不妨点一个赞!