带小白理解php的自动加载
什么是自动加载
自动加载是指在你想使用某个类,但你没有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就可以自动加载相应的类。想象一下,你并不需要引入对应的类就可以直接使用,这很棒。
如果本文对你有帮助,不妨点一个赞!