【Laravel-海賊王系列】第二章,Application類解析

Application 是框架做爲應用最核心的一個類!

Application 頭部聲明

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,$bindingsbash

$serviceProvoiders 表示已經註冊到應用的服務提供者對象,
 而且包含是否延遲加載信息`

 $loadedProviders 表示已經被加載的服務
 
 $bindings 容器中的綁定數組
複製代碼

registerCoreContainerAliases(); 註冊核心類的別名到容器app

總結

到這裏爲止整個 Application 對象的構造方法完成composer

主要工做是初始化對象的一些成員屬性,因爲繼承了 Container 類框架

繼承的部分紅員也進行初始化,上圖就是在構造函數完成時賦值的相關成員ide

關於這些成員的做用會在後面框架啓動使用中時經常使用到,目前爲止不須要再瞭解更多。函數

相關文章
相關標籤/搜索