<?php
namespace Composer\Autoload;
class ClassLoader
{
// ... 折叠
/**
* Registers this instance as an autoloader.
*
* @param bool $prepend Whether to prepend the autoloader or not
*/
// 调用了该方法 注册了 ClassLoader 类,和 loadClass 方法
public function register($prepend = false)
{
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
}
/**
* Loads the given class or interface.
*
* @param string $class The name of the class
* @return bool|null True if loaded, null otherwise
*/
// 该方法就是根据 $class 查找该变量对应的文件,并引入。
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
includeFile($file);
return true;
}
}
// ... 折叠
}
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*/
function includeFile($file)
{
include $file;
}
<?php
/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| The first thing we will do is create a new Laravel application instance
| which serves as the "glue" for all the components of Laravel, and is
| the IoC container for the system binding all of the various parts.
|
*/
// 这里 new 了一个类,进入该文件看看
$app = new Illuminate\Foundation\Application(
$_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
// ... 折叠
从
/public/index.php
入口引入了
autoload.php
进入
/vendor/autoload.php
引入了
/vendor/composer/autoload_real.php
并调用了getLoader
方法进入
/vendor/composer/autoload_real.php
进入
/vendor/composer/autoload_static.php
Closure 的用法实例,可以参考这里 此时 $loader 的四个私有变量值已经改变。
为什么这里不用setVal() 方法呢?比如:
回到
/vendor/composer/autoload_real.php
进入
vendor/composer/ClassLoader.php
回到
/vendor/composer/autoload_real.php
此时 autoload.php 运行完毕了,回到 index.php
回到
/public/index.php
进入
/bootstrap/app.php
这里有个 PHP 7.0 引入的新运算符
??
参考文档所以 这里传入的值始是
dirname(__DIR__)
也就是laravel 源码
的根目录