ThinkPHP容器/依賴注入/靜態(tài)代理/請求對象

閱讀原文

一婿滓、容器與依賴注入的原理

  1. 任何的URL訪問,最終都是定位到控制器啊研,由控制器中某個具體的方法去執(zhí)行
  2. 一個控制器對應(yīng)著一個類,如果這些類需要進行統(tǒng)一管理鸥拧,怎么辦党远?
  3. 容器來進行類管理,還可以將類的實例(對象)作為參數(shù)住涉,傳遞給類方法麸锉,自動觸發(fā)依賴注入
  • 依賴注入:將對象類型的數(shù)據(jù)钠绍,以參數(shù)的方式傳到方法的參數(shù)列表
  • URL訪問:通過GET方式將數(shù)據(jù)傳到控制器指定的方法中舆声,但是只能傳字符串,數(shù)值
  • 如果要傳一個對象到當前方法中柳爽?怎么辦媳握?
  • 依賴注入:解決了向類中的方法傳遞對象的問題

依賴注入示例

protected $user;

public function __construct(UserModel $user)
{
    $this->user = $user;
}

/* 和上面是等價的
public function __construct(){
    $user = new UserModel();
    return $user->name;
}
*/

public function hello()
{
    return 'Hello,' . $this->user->name . '!';
} 

ThinkPHP的設(shè)計中磷脯,think\App類雖然自身不是容器蛾找,但卻是一個容器管理類,可以完成容器的所有操作赵誓。

V5.1.14+版本開始打毛,應(yīng)用類自身就是一個容器實例柿赊。

這里演示的是通過助手函數(shù)來進行綁定,當然也可以用think\Container操作

  • 調(diào)用和綁定的標識必須保持一致(包括大小寫)
  • 你可以綁定一個類到容器中(第一個參數(shù)直接傳入類名)
  • 只要調(diào)用過一次后就會自動綁定
  • 綁定的類標識可以自己定義(只要不沖突)

容器綁定示例

public function bind()
{
    // 綁定類庫標識
    bind('user','app\demo\model\UserModel');

    // 快速調(diào)用(自動實例化)
    $user = app('user');
    $user->name = '123';

    echo '$user->name , ' . $user->name . '幻枉!<br>';
    
    //容器中已經(jīng)調(diào)用過的類會自動使用單例
    //除非你使用下面的方式強制重新實例化碰声。
    //每次調(diào)用都會重新實例化
    $user = app('user',true);

    echo '$user->name , ' . $user->name . '!<br>';

    $user = app('user',['帶參數(shù)實例'],true);

    echo '$user->name , ' . $user->name . '熬甫!';
}

閉包綁定

/**
 * 綁定閉包
 * 可以把一個閉包方法綁定到容器中
 * \think\Container 方式
 */
public function bindClosure()
{
    \think\Container::set('sayHello', function ($name) {
        return 'hello,' . $name;
    });

    return \think\Container::get('sayHello',['name'=>'yuan']);
}

二胰挑、靜態(tài)代理

門面(Facade)為容器中的類提供了一個靜態(tài)調(diào)用接口,相比于傳統(tǒng)的靜態(tài)方法調(diào)用椿肩,帶來了更好的可測試性和擴展性瞻颂,你可以為任何的非靜態(tài)類庫定義一個Facade類。

系統(tǒng)已經(jīng)為大部分核心類庫定義了Facade郑象,所以你可以聽過Facade來訪問這些系統(tǒng)類贡这,當然也可以為你的應(yīng)用類庫添加靜態(tài)代理。

靜態(tài)代理示例

創(chuàng)建示例類Facade.php

<?php

namespace app\demo\controller;

// use app\demo\model\UserModel;

class Facade
{
    public function index($name='yuan')
    {
        // $user = new UserModel();
        // return $user->sayHello('everyBody');

        /**
         * 如果靜態(tài)調(diào)用一個動態(tài)方法扣唱,需要給當前的類綁定一個靜態(tài)代理類
         */

         return \app\facade\UserModel::sayHello('everyBody');
    }
}

創(chuàng)建文件app\facade\UserModel.php

<?php

namespace app\facade;

class UserModel extends \think\Facade
{
    protected static function getFacadeClass()
    {
        return 'app\demo\model\UserModel';
    }
}

也可以修改app\facade\UserModel.php

<?php

namespace app\facade;

class UserModel extends \think\Facade
{

}

修改app\demo\controller\Facade.php

<?php

namespace app\demo\controller;

class Facade
{
    public function index($name='yuan')
    {
        
        /*如果沒有在靜態(tài)代理類中顯示要指定要綁定的類名藕坯,就需要動態(tài)顯示綁定一下
          \think\Facade::bind()
        */
        \think\Facade::bind('app\facade\UserModel','app\demo\model\UserModel');
        return \app\facade\UserModel::sayHello('everyBody');
    }
}

打印效果一樣

三、請求對象

  • 正常情況下噪沙,控制器不依賴于父類Controller.php
  • 推薦繼承于父類炼彪,可以很方便的使用在父類中封裝好的一些方法和屬性
  • Controller.php沒有靜態(tài)代理
  • 控制器中的輸出,字符串全部用return返回正歼,不要用echo
  • 如果輸出的是復(fù)雜類型辐马,我們可以用dump()函數(shù)
  • 默認輸出的格式為html,可以指定為其他格式json

調(diào)用方式

  1. 傳統(tǒng)的 new Request
  2. 靜態(tài)代理:think\facade\Request
  3. 依賴注入:Request $request
  4. 父類Controller中的屬性$request:$this->request

示例代碼

class Controller extends \think\Controller
{
    //依賴注入
    public function test(Request $request)
    {
        dump($request->get());
    }

    //父類屬性
    public function test2()
    {
        dump($this->request->get());
    }

    //靜態(tài)代理
    public function test3()
    {
        return (json_encode(Request::get()));
    }
}

示例效果

返回json

總結(jié)

這一章講了容器/依賴注入/靜態(tài)代理/請求對象技術(shù)相關(guān)操作局义,

  • ThinkPHP5.1中使用了注冊樹模式喜爷,這里的容器就是注冊樹模式,之前講過應(yīng)該很熟悉了萄唇。
  • 依賴注入就是將對象類型的數(shù)據(jù)檩帐,以參數(shù)的方式傳到方法的參數(shù)列表,沒什么高深的東西另萤。
  • 靜態(tài)代理為容器中的類提供了一個靜態(tài)調(diào)用接口湃密,相比于傳統(tǒng)的靜態(tài)方法調(diào)用,帶來了更好的可測試性和擴展性
  • 請求對象介紹了四種方式獲取請求參數(shù)

同時感謝PHP中文網(wǎng) 的教學(xué)資源...

以上均是自學(xué)過程的積累四敞,學(xué)到哪記到哪

原創(chuàng)文章泛源,轉(zhuǎn)載請注明出處,謝謝忿危!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末达箍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子铺厨,更是在濱河造成了極大的恐慌缎玫,老刑警劉巖硬纤,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赃磨,居然都是意外死亡咬摇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門煞躬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肛鹏,“玉大人,你說我怎么就攤上這事恩沛≡谌牛” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵雷客,是天一觀的道長芒珠。 經(jīng)常有香客問我,道長搅裙,這世上最難降的妖魔是什么皱卓? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮部逮,結(jié)果婚禮上娜汁,老公的妹妹穿的比我還像新娘。我一直安慰自己兄朋,他們只是感情好掐禁,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颅和,像睡著了一般傅事。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上峡扩,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天蹭越,我揣著相機與錄音,去河邊找鬼教届。 笑死响鹃,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的巍佑。 我是一名探鬼主播茴迁,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼寄悯,長吁一口氣:“原來是場噩夢啊……” “哼萤衰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起猜旬,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤脆栋,失蹤者是張志新(化名)和其女友劉穎倦卖,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椿争,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡怕膛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了秦踪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褐捻。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖椅邓,靈堂內(nèi)的尸體忽然破棺而出柠逞,到底是詐尸還是另有隱情,我是刑警寧澤景馁,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布板壮,位于F島的核電站,受9級特大地震影響合住,放射性物質(zhì)發(fā)生泄漏绰精。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一透葛、第九天 我趴在偏房一處隱蔽的房頂上張望笨使。 院中可真熱鬧,春花似錦僚害、人聲如沸阱表。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽最爬。三九已至,卻和暖如春门岔,著一層夾襖步出監(jiān)牢的瞬間爱致,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工寒随, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留糠悯,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓妻往,卻偏偏與公主長得像互艾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讯泣,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

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