spl_autoload_register() 函数实现的自动加载

和Python用module来区分代码块不同,PHP按照命名空间来区分,开始学PHP的时候一心认定了如果想用 use 关键字来导入(Python的习惯说法)一个类或者函数或者其他对象的话,必须先include该对象所在的文件,或者require该文件.相当于是把该文件代码加载到内存代码块中,从而能够搜索代码块并使用.

但是看了thinkPHP框架和guthub上一些项目后发现他们的代码挺潇洒的,居然不用include/require.这让我对自己的认识产生了质疑...

少废话了,自动加载使用的是PHP的

spl_autoload_register

函数,该函数的作用是用于注册一些搜索规则*

当代码需要引用某些变量,类等的时候,如果当前内存代码块中没有,那么就会从这些注册的规则中取挨个的套用匹配,直到找不到,然后报错.

函数使用方式:

spl_autoload_register(function, throw, prepend)  // throw 全都找不到是否抛错 prepend 是否将规则加在队列最前面(如果你的规则十分个性独特,就可以放在最前面)

也可以用匿名函数的方式:

<?php

namespace spa;

spl_autoload_register(function ($class) {
    echo "wanted " . $class . "
";
    if ($class == "spaSpace") {
        $class = "Space.php";
    } elseif ($class == "spaEle") {
        $class = __DIR__."/../learn_php/Ele.php";
    }
    include_once $class;
});

通过测试发现,每次需要执行本文件本命名空间不存在的代码块的时候,都会执行一遍如上注册的函数,然后echo出的信息,当然项目框架最好是按照严格的命名规范来,这样也容易写出匹配规则,然后把该函数在项目的必经之路上执行一遍,就可以和那些潇洒的代码一样,直接 use ,不用include/require 文件了.

*注意:

注册规则的代码一定要最先执行,或者至少要在你本应当执行include/require之前被执行.

原文地址:https://www.cnblogs.com/haiton/p/12073333.html