Laravel 源碼學習 基礎知識

在學習 Laravel 源碼前,有幾個 PHP 的基礎知識是必須熟悉的。基礎知識熟悉之后,框架再復雜,也能慢慢地理解和上手。

Composer

Composer 是 PHP 的一個包依賴管理工具。你可以在自己的項目中聲明所依賴的外部 Package ,Composer 會幫你安裝這些依賴的包文件。比如你的項目準備使用
monolog/monolog 來記錄日志,你只需要:

  1. 在命令行執行 composer require monolog/monolog,Composer 會自動將這個包及所需的依賴文件下載到當前目錄的 vendor 文件夾下。
    monolog 目錄.png
  2. 在你的項目中引入 Composer 的自動加載文件。
require 'vendor/autoload.php';

然后就能使用 monolog 類了。

?php

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// create a log channel
$log = new Logger('name');
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));

Composer 的安裝步驟可以參考官方的文檔

基本使用

  1. 常用 Composer 命令。
命令 說明
composer install 首先會根據 composer.lock 文件下載依賴;如果 composer.lock 文件沒有,才會根據 composer.json 下載配置的依賴(并自動創建 composer.lock 文件)。下載后的依賴包會自動放在當前路徑的 vendor 目錄下
composer update 根據你的 composer.json 文件更新依賴包(并自動更新 composer.lock 文件)。還可通過 composer update packageName 對單個包進行更新
composer dump-autoload 更新 autoloader 自動加載。比如你添加了新的目錄,想讓他自動加載
composer validate 檢測你的 composer.json 文件是否有效
  1. 自動加載
    通過 composer.json 安裝的依賴包,引入 vendor/autoload.php 文件后,系統會自動加載,非 packagist.org 中的包,手動更新 composer.json 文件。
    這里有4種方法引入其他的自動加載:
"autoload": {
        // 目錄中的文件會在 install/update 過程中生成,并存儲到 vendor/composer/autoload_classmap.php  文件中
        // 支持自定義加載的不遵循 PSR-0/4 規范的類庫
        "classmap": [
            "database"
        ],
        // PSR-4 規范的類庫。 鍵為命名空間,值為對應的目錄
        "psr-4": {
            "App\\": "app/"
        },
        // PSR-0 規范的類庫
        "psr-0": {
            "Monolog\\": "src/"
        },
        // 每次請求時都會載入某些文件,通常作為通用函數庫
        "files": [
            "app/helper.php"
        ]
    },

PSR-4 規范參考,PSR-0 規范已經被廢棄。

反射

通俗地說 反射 就是通過字符串 來獲取對應類、類方法、類屬性、類中方法和屬性的注釋的功能。比如系統中存在下面一個類:

<?php
class person {
    private $age;

    public function __construct() {
    }

    public function getAge() {
        return $this->age;
    }

    public function setAge($age) {
        $this->age = $age;
    }
}

如果知道了類名 person , 要在框架中實例化, 最簡單的方法是

$name = 'person';
$class = new $name();

但是如果 person 的構造方法中有參數呢,下面是通過反射獲取一個類的實例簡化的方法

function build($class) {
    // 通過類名獲取反射類
    $reflector = new ReflectionClass($class);
    // 獲取類的構造函數
    $constructor = $reflector->getConstructor();
    // 獲取構造函數的參數
    $dependencies = $constructor->getParameters();

    $instances = [];
    // 獲取參數對象和默認值
    foreach ($dependencies as $dependency) {
        // 獲取參數的默認值
        if ($dependency->isDefaultValueAvailable()) {
            $instances[] = $dependency->getDefaultValue();
            continue;
        }
        // 獲取參數的對象
        $instances[] = build($dependency->getClass()->name);
    }

    // 獲取反射類的實例
    return $reflector->newInstanceArgs($instances);
}

Laravel 框架的依賴注入以是使用 PHP 的反射來實例化類和構造方法中的對象的。

匿名函數

也叫閉包函數,是一個沒有名字的函數。匿名函數默認是 Closure 類型的對象。

<?php
$add = function ($a, $b) {
    return $a + $b;
};
echo ($add instanceof Closure) ? 'true':'false';

上面 $add 是一個匿名函數的變量,結果會打印出 true
在 Laravel 中匿名函數主要用于綁定類、注冊服務等。

// 綁定閉包到一個抽象類
function singleton($abstract, $concrete = null) {
    // ...
    // 如果 $concrete 不是一個閉包,則將它構造成一個閉包
    if (! $concrete instanceof Closure) {
        $concrete = $this->getClosure($abstract, $concrete);
    }

    // 將閉包存入數組中
    $this->bindings[$abstract] = compact('concrete', 'shared');

    // ...
}

// 獲取抽象類的實例
function resolve($abstract) {
    // 獲取綁定的內容
    $concrete = $this->bindings[$abstract]['concrete'];

    // 如果是閉包,則直接實例化
    if ($concrete instanceof Closure) {
        return $concrete($this, $this->getLastParameterOverride());
    }
}

通過匿名函數,在綁定時可以不用實例化類,然后在需要用到類的時候再解析類,避免了不需要的實例化。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Laravel 學習交流 QQ 群:375462817 本文檔前言Laravel 文檔寫的很好,只是新手看起來會有...
    Leonzai閱讀 8,031評論 2 12
  • 本系列文章主要是方便初學 laravel 的人入門,幫一些朋友認識到如何入門、如何學習 laravel,同時補充一...
    拉風的老衲閱讀 605評論 0 10
  • 原文地址:http://www.insp.top/learn-laravel-container 本系列文章主要是...
    Bensontung閱讀 1,172評論 0 4
  • 何處無月明,天涯共此時。愿月光溫柔撫慰她的心。 中秋節,最深的記憶是小時候。每到八月半,鄉下都有祭月亮...
    歡喜心育兒說閱讀 363評論 0 0
  • 在這之前,內心常常涌起的都是對自己的嫌惡。 討厭自己的外表,討厭自己滿臉都是痘痘,討厭自己的性格,討厭自己的聲音,...
    王律師閱讀 339評論 0 1