上一篇,我们讲了使用命名空间后,对其他类的加载的一个规范管理
本篇我们就讲一下类的自动载入功能。
大家现在接触的框架内,很少会看到require函数的出现,难道现在引入类都不需要reqiure了吗?其实是使用了php的自动载入功能。
首先我们要知道函数 spl_autoload_register()
参数传递类加载的方法。
官方解释:当使用尚未被定义的类(class)和接口(interface)时自动去加载。通过注册自动加载器,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
意思就是,当你直接去实例化或者使用一个尚未被引入或者实现的类和接口时,php会在异常前去执行spl_autoload_register()内部的加载器。如果在加载器内部实现了该类的引入,就可以实现自动加载功能。
我们写个demo实践一下:
新建a.php
<?php
namespace a\b\c;
class Dog{
function say()
{
echo 'this is a dog';
}
}
新建b.php
<?php
namespace d\e\f;
class Dog{
function say()
{
echo 'this is b dog';
}
}
新建index.php:
<?php
use a\b\c\Dog;
use d\e\f\Dog as Dog2;
function autoload(){
require('a.php');
require('b.php');
}
spl_autoload_register('autoload');
$a = new Dog();
$a->say();
$b = new Dog2();
$b->say();
现在我们将require方法写在方法加载器内,然后使用spl_autoload_register去加载加载器。运行正常。
当然我们也可以直接写一个闭包函数来实现:
<?php
use a\b\c\Dog;
use d\e\f\Dog as Dog2;
spl_autoload_register(function ()
{
require('a.php');
require('b.php');
});
$a = new Dog();
$a->say();
$b = new Dog2();
$b->say();
接下来我们去优化一下,以免第一次调用spl_autoload_register的时候,引入了所有的方法。
修改autoload方法:
function autoload($class){
// require('a.php');
// require('b.php');
require(__DIR__.'\\'."$class".'.'.'php');
}