Laravel 源碼學(xué)習(xí) 基礎(chǔ)知識(shí)

在學(xué)習(xí) Laravel 源碼前劫哼,有幾個(gè) PHP 的基礎(chǔ)知識(shí)是必須熟悉的划乖。基礎(chǔ)知識(shí)熟悉之后昼捍,框架再復(fù)雜识虚,也能慢慢地理解和上手。

Composer

Composer 是 PHP 的一個(gè)包依賴管理工具妒茬。你可以在自己的項(xiàng)目中聲明所依賴的外部 Package 担锤,Composer 會(huì)幫你安裝這些依賴的包文件。比如你的項(xiàng)目準(zhǔn)備使用
monolog/monolog 來記錄日志乍钻,你只需要:

  1. 在命令行執(zhí)行 composer require monolog/monolog肛循,Composer 會(huì)自動(dòng)將這個(gè)包及所需的依賴文件下載到當(dāng)前目錄的 vendor 文件夾下。
    monolog 目錄.png
  2. 在你的項(xiàng)目中引入 Composer 的自動(dòng)加載文件团赁。
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 首先會(huì)根據(jù) composer.lock 文件下載依賴熬丧;如果 composer.lock 文件沒有,才會(huì)根據(jù) composer.json 下載配置的依賴(并自動(dòng)創(chuàng)建 composer.lock 文件)怀挠。下載后的依賴包會(huì)自動(dòng)放在當(dāng)前路徑的 vendor 目錄下
composer update 根據(jù)你的 composer.json 文件更新依賴包(并自動(dòng)更新 composer.lock 文件)析蝴。還可通過 composer update packageName 對(duì)單個(gè)包進(jìn)行更新
composer dump-autoload 更新 autoloader 自動(dòng)加載害捕。比如你添加了新的目錄,想讓他自動(dòng)加載
composer validate 檢測(cè)你的 composer.json 文件是否有效
  1. 自動(dòng)加載
    通過 composer.json 安裝的依賴包闷畸,引入 vendor/autoload.php 文件后尝盼,系統(tǒng)會(huì)自動(dòng)加載,非 packagist.org 中的包佑菩,手動(dòng)更新 composer.json 文件盾沫。
    這里有4種方法引入其他的自動(dòng)加載:
"autoload": {
        // 目錄中的文件會(huì)在 install/update 過程中生成,并存儲(chǔ)到 vendor/composer/autoload_classmap.php  文件中
        // 支持自定義加載的不遵循 PSR-0/4 規(guī)范的類庫
        "classmap": [
            "database"
        ],
        // PSR-4 規(guī)范的類庫殿漠。 鍵為命名空間赴精,值為對(duì)應(yīng)的目錄
        "psr-4": {
            "App\\": "app/"
        },
        // PSR-0 規(guī)范的類庫
        "psr-0": {
            "Monolog\\": "src/"
        },
        // 每次請(qǐng)求時(shí)都會(huì)載入某些文件,通常作為通用函數(shù)庫
        "files": [
            "app/helper.php"
        ]
    },

PSR-4 規(guī)范參考绞幌,PSR-0 規(guī)范已經(jīng)被廢棄蕾哟。

反射

通俗地說 反射 就是通過字符串 來獲取對(duì)應(yīng)類、類方法莲蜘、類屬性谭确、類中方法和屬性的注釋的功能。比如系統(tǒng)中存在下面一個(gè)類:

<?php
class person {
    private $age;

    public function __construct() {
    }

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

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

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

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

但是如果 person 的構(gòu)造方法中有參數(shù)呢逐哈,下面是通過反射獲取一個(gè)類的實(shí)例簡化的方法

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

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

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

Laravel 框架的依賴注入以是使用 PHP 的反射來實(shí)例化類和構(gòu)造方法中的對(duì)象的。

匿名函數(shù)

也叫閉包函數(shù)庄新,是一個(gè)沒有名字的函數(shù)鞠眉。匿名函數(shù)默認(rèn)是 Closure 類型的對(duì)象。

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

上面 $add 是一個(gè)匿名函數(shù)的變量择诈,結(jié)果會(huì)打印出 true 械蹋。
在 Laravel 中匿名函數(shù)主要用于綁定類、注冊(cè)服務(wù)等羞芍。

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

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

    // ...
}

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

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

通過匿名函數(shù)荷科,在綁定時(shí)可以不用實(shí)例化類唯咬,然后在需要用到類的時(shí)候再解析類,避免了不需要的實(shí)例化畏浆。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胆胰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子刻获,更是在濱河造成了極大的恐慌蜀涨,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異厚柳,居然都是意外死亡氧枣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門别垮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來便监,“玉大人,你說我怎么就攤上這事碳想∩斩” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵移袍,是天一觀的道長解藻。 經(jīng)常有香客問我老充,道長葡盗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任啡浊,我火速辦了婚禮觅够,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巷嚣。我一直安慰自己喘先,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布廷粒。 她就那樣靜靜地躺著窘拯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坝茎。 梳的紋絲不亂的頭發(fā)上涤姊,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音嗤放,去河邊找鬼思喊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛次酌,可吹牛的內(nèi)容都是我干的恨课。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼岳服,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼剂公!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吊宋,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤纲辽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體文兑,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盒刚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绿贞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片因块。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖籍铁,靈堂內(nèi)的尸體忽然破棺而出涡上,到底是詐尸還是另有隱情,我是刑警寧澤拒名,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布吩愧,位于F島的核電站,受9級(jí)特大地震影響增显,放射性物質(zhì)發(fā)生泄漏雁佳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一同云、第九天 我趴在偏房一處隱蔽的房頂上張望糖权。 院中可真熱鬧,春花似錦炸站、人聲如沸星澳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽禁偎。三九已至,卻和暖如春阀坏,著一層夾襖步出監(jiān)牢的瞬間如暖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工全释, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留装处,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓浸船,卻偏偏與公主長得像妄迁,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子李命,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Laravel 學(xué)習(xí)交流 QQ 群:375462817 本文檔前言Laravel 文檔寫的很好登淘,只是新手看起來會(huì)有...
    Leonzai閱讀 7,835評(píng)論 2 12
  • 本系列文章主要是方便初學(xué) laravel 的人入門,幫一些朋友認(rèn)識(shí)到如何入門封字、如何學(xué)習(xí) laravel黔州,同時(shí)補(bǔ)充一...
    拉風(fēng)的老衲閱讀 602評(píng)論 0 10
  • 原文地址:http://www.insp.top/learn-laravel-container 本系列文章主要是...
    Bensontung閱讀 1,145評(píng)論 0 4
  • 何處無月明耍鬓,天涯共此時(shí)。愿月光溫柔撫慰她的心流妻。 中秋節(jié)牲蜀,最深的記憶是小時(shí)候。每到八月半绅这,鄉(xiāng)下都有祭月亮...
    歡喜心育兒說閱讀 349評(píng)論 0 0
  • 在這之前涣达,內(nèi)心常常涌起的都是對(duì)自己的嫌惡。 討厭自己的外表证薇,討厭自己滿臉都是痘痘度苔,討厭自己的性格,討厭自己的聲音浑度,...
    王律師閱讀 324評(píng)論 0 1