思想
依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,
例如在控制器架构方法和操作方法中一旦对参数进行对象类型约束则会自动触发依赖注入,
由于访问控制器的参数都来自于URL请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成。
<?php
namespace app\controller;
use think\Request;
class Index
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function hello($name)
{
return 'Hello,' . $name . '!This is '. $this->request->action();
}
}
构造方法实例化
$foo = new Foo($bar);
$foo = invoke('Foo');
普通方法实例化
$result = invoke(['Foo', 'bar']);
手动绑定类:前面是名字 后面是真实的类文件
$this->app->bind('think\Cache', 'app\common\Cache');
bind('cache', 'think\Cache');
手动绑定对象
$cache = new think\Cache;
// 绑定类实例
bind('cache', $cache);
全局绑定provider.php
<?php
use app\ExceptionHandle;
use app\Request;
// 容器Provider定义文件
return [
'think\Request' => Request::class,
'think\exception\Handle' => ExceptionHandle::class,
];
TP很多内置的绑定
类的实例化使用
$app = app();
// 判断对象实例是否存在
isset($app->cache);
// 注册容器对象实例
$app->cache = think\Cache::class;
// 获取容器中的对象实例
$cache = $app->cache;