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;
}
}