PHP的自动加载auto_load功能实现与原理

大家现在接触的框架内,很少会看到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');
}   

大致spl_autoload_register的使用就到这里。

posted on 2019-12-05 11:18  keinleerun  阅读(611)  评论(0)    收藏  举报

导航