namespace Illuminate\Foundation;
use Closure; // php 默認匿名函數類
use RuntimeException; // 運行異常類
use Illuminate\Support\Arr; // laravel 數組操做類
use Illuminate\Support\Str; // laravel 字符串操做類
use Illuminate\Http\Request; // laravel 請求對象類
use Illuminate\Support\Collection; // laravel 集合類
use Illuminate\Container\Container; // laravel 容器類
use Illuminate\Filesystem\Filesystem; // laravel 文件系統類
use Illuminate\Log\LogServiceProvider; // laravel 日誌服務提供者
use Illuminate\Support\ServiceProvider; // laravel 服務提供者類
use Illuminate\Events\EventServiceProvider;// laravel 事件服務提供者
use Illuminate\Routing\RoutingServiceProvider;// laravel 路由服務提供者
use Symfony\Component\HttpKernel\HttpKernelInterface;// Symfony 內核接口
use Symfony\Component\HttpKernel\Exception\HttpException;/ /Symfony Http 異常類
use Illuminate\Contracts\Http\Kernel as HttpKernelContract;// laravel 內核類
use Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables;// laravel 載入環境變量類
use Symfony\Component\HttpFoundation\Request as SymfonyRequest; // Symfony 請求類
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; // Symfony NotFound 異常類
use Illuminate\Contracts\Foundation\Application as ApplicationContract;// laravel 應用契約
class Application extends Container implements ApplicationContract, HttpKernelInterface
複製代碼
Application 對象繼承了 Container 對象,同時實現 ApplicationContract 契約和 HttpKernelInterface 接口。php
自身成員變量
const VERSION = '5.7.26'; // 當前版本號
protected $basePath; // 應用的基礎路徑
protected $hasBeenBootstrapped = false; // 標識應用以前是否啓動過
protected $booted = false; // 標識應用是否已經被啓動
protected $bootingCallbacks = []; // 應用在啓動中的回調
protected $bootedCallbacks = []; // 應用啓動後的回調
protected $terminatingCallbacks = []; // 應用終止中的回調
protected $serviceProviders = []; // 全部註冊的服務提供者
protected $loadedProviders = []; // 已經加載的服務提供者
protected $deferredServices = []; // 延遲加載的服務提供者
protected $appPath; // 應用路徑
protected $databasePath; // 數據路徑
protected $storagePath; // 存儲目錄路徑
protected $environmentPath; // 環境變量路徑
protected $environmentFile = '.env';
protected $namespace; // 從composer的autoload.psr-4中讀取,對應的值爲'App\'
繼承於 Container 的成員
protected static $instance;
protected $resolved = [];
protected $bindings = [];
protected $methodBindings = [];
protected $instances = [];
protected $aliases = [];
protected $abstractAliases = [];
protected $extenders = [];
protected $tags = [];
protected $buildStack = [];
protected $with = [];
public $contextual = [];
protected $reboundCallbacks = [];
protected $globalResolvingCallbacks = [];
protected $globalAfterResolvingCallbacks = [];
protected $resolvingCallbacks = [];
protected $afterResolvingCallbacks = [];
複製代碼
public function __construct($basePath = null)
{
if ($basePath) {
$this->setBasePath($basePath); // 對$this->instances賦值
}
$this->registerBaseBindings(); //初始化$instance成員的值爲$this (Application對象) ,繼續對$this->instances賦值
$this->registerBaseServiceProviders();
$this->registerCoreContainerAliases();
}
複製代碼
賦值後的結果: laravel
繼續分析 registerBaseServiceProviders();
數組
protected function registerBaseServiceProviders()
{
$this->register(new EventServiceProvider($this)); // 最後調用EventServiceProvider->register();
$this->register(new LogServiceProvider($this)); // 同上
$this->register(new RoutingServiceProvider($this)); // 同上
}
複製代碼
全部基礎服務涉及成員$serviceProviders,$loadedProiders,$bindings
bash
$serviceProvoiders 表示已經註冊到應用的服務提供者對象,
而且包含是否延遲加載信息`
$loadedProviders 表示已經被加載的服務
$bindings 容器中的綁定數組
複製代碼
registerCoreContainerAliases();
註冊核心類的別名到容器app
到這裏爲止整個 Application 對象的構造方法完成composer
主要工做是初始化對象的一些成員屬性,因爲繼承了 Container 類框架
繼承的部分紅員也進行初始化,上圖就是在構造函數完成時賦值的相關成員ide
關於這些成員的做用會在後面框架啓動使用中時經常使用到,目前爲止不須要再瞭解更多。函數