1

什么是自动加载

自动加载是指在你想使用某个类,但你没有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)当程序执行到&dollar;operation = new IMoocOperation(10);时,php引擎就会搜索作用域下是否有IMoocOperation这个类,如果有,则正常引入,如果没有则(2)调用spl_autoload_register()方法,然后再执行(3)autoload方法,autoload的参数&dollar;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就可以自动加载相应的类。想象一下,你并不需要引入对应的类就可以直接使用,这很棒。
如果本文对你有帮助,不妨点一个赞!


北方
85 声望8 粉丝

lovema.xyz