spl_autoload_register 与__autoload

spl_autoload_register 与__autoload

spl_autoload_register 与__autoload都是尝试加载未定义的类。一般我们是实例化一个类比如new Foo();就是需要先include('Foo.php');使用spl_autoload_register 与__autoload就可以避免这种操作,减少include代码。

区别

spl_autoload_register允许存在多个自动加载器,而__autoload只允许一个加载器。
__autoload将在php7.2中放弃。

利用spl_autoload_register实现简单的命名空间自动加载案例

//Load.php
class Load{
    //声明命名空间与目录的映射
    public static $vendorMap = array(
        'app' => ROOT_DIR . DIRECTORY_SEPARATOR . 'app',
    );

    /**
     自动加载器
    */

    public static function autoLoad($class)
    {
        $file = self::findClassFile($class);
        if(file_exists($file))
        {
            include($file);
        }else
        {
            throw new Exception("Error $file Not Found", 1);
        }
    }

    /**
    * 解析文件路径
    */
    public static function findClassFile($class)
    {
        //class = app\controllers\Index
        //strpos 获取字符串在另一个字符串第一次出现的位置
        $vendor = substr($class,0,strpos($class, '\\')); //顶级命名空间
        $vendorDir = self::$vendorMap[$vendor]; // 文件基目录
        $filePath = substr($class, strlen($vendor)) . '.php'; // 文件相对路径
        return strtr($vendorDir . $filePath, '\\', DIRECTORY_SEPARATOR); // 文件标准路径
    }

}

//test.php
define('ROOT_DIR',__DIR__);
require './namespace/Load.php';
spl_autoload_register('Load::autoload'); // 注册自动加载

$controller = new app\controllers\Index();
echo $controller->IndexAction();


作者:胡乱唱歌ing
链接:https://www.jianshu.com/p/ff0ad35509fa
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

您可能还会喜欢: