TP5.1 容器+依賴注入

1.在公共模塊中創建一個Temp類

<?php
namespace app\common;

class Temp
{

    private $name;
    public function __construct($name = 'Perter')
    {
        $this->name = $name;
    }
    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return '方法是:' . __METHOD__ . '屬性是' . $this->name;
    }
}

2.在創建一個案例控制器類,便於url測試訪問

<?php
namespace app\index\controller;

/**
 * 容器與依賴注入的原理
 * 1.任何的url訪問,最終都是定位到控制器,由控制器的某個方法去執行
 * 2.一個控制器對應着一個類,如果這些類需要進行同統一管理,怎麼辦?
 * 容器來進行類管理,不僅僅可以管理類,還可以將類的實例(對象)作爲參數,傳遞給類方法,自動觸發依賴注入
 * 依賴注入:將對象類型的數據,以參數的形式傳到方法的參數列表中
 * URL訪問:通過get方式將數據傳到控制器指定方法中,但是隻能傳遞字符串,數值
 * 舉例:localhost/tp51/index/Demo1/getname/name/thinkphp51   --hello thinkphp51
 * 如果傳遞一個對象到當前方法中?怎麼辦?
 * 依賴注入:解決了向類中傳遞對象的問題
 *
 */
class Demo1
{
    //可以通過字符串,數值用get方式傳值到類方法中
    public function getName($name = 'Perter')
    {
        return "hello" . $name;
    }
    /**
     * \app\common\Temp $temp :將會觸發依賴注入
     * \app\common\Temp $temp 等價於$temp=new \app\common\Temp;
     *實例化參數對象的技術
     */
    public function getMethod(\app\common\Temp $temp)
    {
        $temp->setName('PHP中文網');
        return $temp->getName();
    }

    //綁定一個類到容器
    public function bindClass()
    {
        //把一個類放到容器中:相當於註冊到容器中
        \think\Container::set('temp', '\app\common\Temp');
        //將容器中的類實例化並取出來用:實例化時可同時調用構造器進行初始化
        $temp = \think\Container::get('temp', ['name' => 'Peter_Zhu']);
        return $temp->getName(); //方法是:app\common\Temp::getName屬性是Peter_Zhu
    }

    //使用助手函數實現綁定一個類到容器的功能
    public function bindClass1()
    {
        //把一個類放到容器中:相當於註冊到容器中
        bind('temp','\app\common\Temp');
        //將容器中的類實例化並取出來用:實例化時可同時調用構造器進行初始化
        $temp = app('temp',['name' => 'Peter_Zhu1']);
        return $temp->getName();  //方法是:app\common\Temp::getName屬性是Peter_Zhu1
    }

    //綁定一個閉包到容器:閉包現在請理解爲一個匿名函數
    public function bindClosure()
    {
        //把一個閉包放到容器中
        \think\Container::set('demo', function($domain){
            return 'PHP中文網的域名是'.$domain;
        });
        //將容器中的閉包取出來用
        $temp = \think\Container::get('demo', ['domain' =>'www.php.cn']);
        return $temp; 
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章