PHP开发

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

2018-04-25  本文已影响0人  hankviv

上一篇,我们讲了使用命名空间后,对其他类的加载的一个规范管理
本篇我们就讲一下类的自动载入功能。


大家现在接触的框架内,很少会看到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的使用就到这里。

上一篇 下一篇

猜你喜欢

热点阅读