理解自动加载函数的原理
在实例话一个类时,如有全局的自动加载函数,则会将类的命名空间及类名传入到加载函数,然后由加载函数解析加载对应的路径。
function autoload($classname) {
$filename = "./". $classname .".php";
include_once($filename);
//传入的参数为 'App\myClass'
}
spl_autoload_register('autoload');
// we've called a class ***
$obj = new \App\myClass();
以下为composer autoload代码
在项目中引入 /vendor/autoload.php
autoload.php 代码如下
require_once __DIR__ . '/composer/autoload_real.php';
//引入文件
return ComposerAutoloaderInit049a9ec039ede8fcb8a98243cf5ce34b::getLoader();
//调用静态方法 并返回
getLoader 方法代码如下
public static function getLoader()
{
//判断是否实例化,如已实例化则返回
if (null !== self::$loader) {
return self::$loader;
}
//注册自动加载函数
spl_autoload_register(array('ComposerAutoloaderInit049a9ec039ede8fcb8a98243cf5ce34b', 'loadClassLoader'), true, true);
//返回自动加载
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
//将上面的自动加载函数移除
spl_autoload_unregister(array('ComposerAutoloaderInit049a9ec039ede8fcb8a98243cf5ce34b', 'loadClassLoader'));
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
//判断php环境和版本 因此选择加载方式
if ($useStaticLoader) {
require_once __DIR__ . '/autoload_static.php';
//将命名空间和文件路径对应
call_user_func(\Composer\Autoload\ComposerStaticInit049a9ec039ede8fcb8a98243cf5ce34b::getInitializer($loader));
} else {
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
$loader->set($namespace, $path);
}
$map = require __DIR__ . '/autoload_psr4.php';
foreach ($map as $namespace => $path) {
$loader->setPsr4($namespace, $path);
}
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
$loader->addClassMap($classMap);
}
}
//注册函数到自动加载函数
$loader->register(true);
//文件搜索的函数
if ($useStaticLoader) {
$includeFiles = Composer\Autoload\ComposerStaticInit049a9ec039ede8fcb8a98243cf5ce34b::$files;
} else {
$includeFiles = require __DIR__ . '/autoload_files.php';
}
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequire049a9ec039ede8fcb8a98243cf5ce34b($fileIdentifier, $file);
}
//返回自动加载
return $loader;
}
这里将命名空间对应文件路径,并添加到loader的属性中
call_user_func(\Composer\Autoload\ComposerStaticInit049a9ec039ede8fcb8a98243cf5ce34b::getInitializer($loader));
$loader->register 将 \Composer\Autoload\ClassLoader(); 的loadclass 函数注册为自动加载函数
网友评论