我是靠谱客的博主 昏睡仙人掌,最近开发中收集的这篇文章主要介绍【ThinkPhp5源码学习】-注册自动加载(一),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

测试用例

1.自动加载类spl_autoload_register

a.php

<?php

class a

{

    function aaa(){

        var_dump("aaa");
    }

}

b.php

<?php

class bbb

{

    function bbb(){

        var_dump("bbb");
    }

}

c.php

<?php

spl_autoload_register(function($class){

    require_once($class.".php");

});

$a = new a;

$a->aaa();

输出结果

<?php
spl_autoload_register('autoload',true,true);
function autoload($class){
	include './'.$class.'.php';
}
$a = new a;
$a->aaa();
<?php
class a{
	function aaa(){
		var_dump("aaa");
	}
}

2.在thinkphp5中应用

<?php
spl_autoload_register($autoload ?: 'think\Loader::autoload', true, true);

如果调用一个不存在的类时则调用autoload这个方法

$rootPath = self::getRootPath();

$rootPath = thinkphp代码位置;

self::$composerPath = $rootPath . 'vendor' . DIRECTORY_SEPARATOR . 'composer' . DIRECTORY_SEPARATOR;

self:$composerPath = 'thinkphp代码位置'./verdor/composer/;

if (is_dir(self::$composerPath)) {
    if (is_file(self::$composerPath . 'autoload_static.php')) {
        require self::$composerPath . 'autoload_static.php';
        $declaredClass = get_declared_classes();   
        $composerClass = array_pop($declaredClass); 
        foreach (['prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files'] as $attr) {
            if (property_exists($composerClass, $attr)) {
                self::${$attr} = $composerClass::${$attr};
            }
        }
    } else {
        self::registerComposerLoader(self::$composerPath);
    }
}

引入文件'thinkphp代码位置'./verdor/composer/autoload_static.php

获取autoload_static文件中ComposerStaticInit05f955dd7900fdf6b8c08829b0d31578类,

循环['prefixLengthsPsr4', 'prefixDirsPsr4', 'fallbackDirsPsr4', 'prefixesPsr0', 'fallbackDirsPsr0', 'classMap', 'files']

查看ComposerStaticInit05f955dd7900fdf6b8c08829b0d31578类中是否存在这些属性,

如果存在则self::这些属性=ComposerStaticInit05f955dd7900fdf6b8c08829b0d31578::这些属性

// 注册命名空间定义
self::addNamespace([
    'think'  => __DIR__,
    'traits' => dirname(__DIR__) . DIRECTORY_SEPARATOR . 'traits',
]);

addNamespace(['think'=>'thnkphp代码位置'/thinkphp/think,'traits'=>'thnkphp代码位置'/thinkphp/traits]); 

// 注册命名空间
public static function addNamespace($namespace, $path = '')
{
    if (is_array($namespace)) {
        foreach ($namespace as $prefix => $paths) {
            self::addPsr4($prefix . '\', rtrim($paths, DIRECTORY_SEPARATOR), true);
        }
    } else {
        self::addPsr4($namespace . '\', rtrim($path, DIRECTORY_SEPARATOR), true);
    }
}

addPsr4('think\','thnkphp代码位置'/thinkphp/think) 

addPsr4('think\','thnkphp代码位置'/thinkphp/traits) 

// 添加Psr4空间
    private static function addPsr4($prefix, $paths, $prepend = false)
    {
        if (!$prefix) {
            // Register directories for the root namespace.
            if ($prepend) {
                self::$fallbackDirsPsr4 = array_merge(
                    (array) $paths,
                    self::$fallbackDirsPsr4
                );
            } else {
                self::$fallbackDirsPsr4 = array_merge(
                    self::$fallbackDirsPsr4,
                    (array) $paths
                );
            }
        } elseif (!isset(self::$prefixDirsPsr4[$prefix])) {
            // Register directories for a new namespace.
            $length = strlen($prefix);
            if ('\' !== $prefix[$length - 1]) {
                throw new InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
            }

            self::$prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
            self::$prefixDirsPsr4[$prefix]                = (array) $paths;
        } elseif ($prepend) {
            // Prepend directories for an already registered namespace.
            self::$prefixDirsPsr4[$prefix] = array_merge(
                (array) $paths,
                self::$prefixDirsPsr4[$prefix]
            );
        } else {
            // Append directories for an already registered namespace.
            self::$prefixDirsPsr4[$prefix] = array_merge(
                self::$prefixDirsPsr4[$prefix],
                (array) $paths
            );
        }
    }

$preficLengthsPsr4['t']['think'] = '?';

$preficDirsPsr4['think'] = '?';

$preficLengthsPsr4['t']['traits'] = '?';

$preficDirsPsr4['traits'] = '?';

// 加载类库映射文件
if (is_file($rootPath . 'runtime' . DIRECTORY_SEPARATOR . 'classmap.php')) {
    self::addClassMap(__include_file($rootPath . 'runtime' . DIRECTORY_SEPARATOR . 'classmap.php'));
}

php think optimize:autoload,可生成classmap.php提高加载性能,这里暂时不运行

 self::addAutoLoadDir($rootPath . 'extend');
// 注册自动加载类库目录
public static function addAutoLoadDir($path)
{
    self::$fallbackDirsPsr4[] = $path;
}

$fallbackDirsPsr4[]='thinkphp代码位置'/extend;

最后

以上就是昏睡仙人掌为你收集整理的【ThinkPhp5源码学习】-注册自动加载(一)的全部内容,希望文章能够帮你解决【ThinkPhp5源码学习】-注册自动加载(一)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部