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