文章目录
以下是关于 《最新ThinkPHP 5.1全球首发视频教程》的第4章的笔记
1.什么是依赖注入?
1.1 依赖注入的概念:
依赖注入指的是将对象类型的数据以参数的方式传到一个方法的参数列表中
1.2 依赖注入的举例:
<?php
class Site
{
public $siteNum=123;
public function getNum()
{
return $this->siteNum;
}
}
//Site $site这里就是依赖注入,等同于在方法里面写$site=new Site();
function test(Site $site){
return $site->getNum();
}
2.什么是容器?
2.1 容器的概念:
在tp中可以把类注册进容器中,想用这个类的实例对象时,可用容器实例化一个类对象来使用。
2.2 容器的举例:
将Demo1注册进容器中,再用容器实例化一个Demo1对象。
<?php
namespace app\index\controller;
class Index
{
public function bindClass(){
//1.把Demo1这个类注册到容器中
//第一个参数是类的别名(可自定义),第二个参数是类的命名空间+类名
\think\Container::set('demo1','\app\index\controller\Demo1');
//2.把容器中的类实例化并取出
//第一个参数是类注册时的别名,第二个参数是类的构造函数所需的参数名=>参数值
$demo1=\think\Container::get('demo1',['num'=>456]);
//3.此时可以使用容器实例出的类对象来调用类方法
return $demo1->getName();
}
}
被注册的类Demo1
<?php
namespace app\index\controller;
class Demo1
{
private $num;
public function __construct($num){
$this->num=$num;
}
public function getName(){
return $this->num;
}
}
\think\Container::set()
和\think\Container::get()
可以被think/helper.php的助手函数bind()
和app()
替换
3.门面是什么?
3.1 门面的概念:
如果想实现静态的去调用一个类的所有的动态(和静态)方法,则可以定义一个Facade的子类,定义一个方法用于返回该类,就可以想调用类方法时,从动态调用$class->function()
变成静态调用class::function()
3.2 门面的好处:
给所有的调用方式提供了一个同一的接口(都用静态调用的形式),代码清晰规范(不会到处都是对象),方便调试
3.3框架已有的常用类的代理:
其实tp框架中的常用类都定义了Facade类库(位置为\think\facade目录),定义后无需实例化就可以直接静态调用类的方法。
3.3 门面的举例:
Demo1类中有一个getNum的方法
<?php
namespace app\index\controller;
class Demo1
{
private $num=123;
public function getNum()
{
return $this->num;
}
}
创建一个Facade类的子类,用来静态代理Demo1类(建议同名因为便于管理)
<?php
namespace app\facade;
class Demo1 extends \think\Facade
{
//重写Facade类的getFacadeClass函数,直接返回本子类所代理的真正类的命名空间
protected static function getFacadeClass()
{
return '\app\index\controller\Demo1';
}
}
代理完毕,现在在别的类中可以直接静态调用Demo1的方法
<?php
namespace app\index\controller;
use app\facade\Demo1;
class Index
{
public function test(){
return Demo1::getNum();
}
}
如果上面的形式觉得不够灵活,可以换成动态绑定代理关系,如下:
首先让刚才创建的Facade的子类中的内容为空
<?php
namespace app\facade;
class Demo1 extends \think\Facade
{
}
然后在需要调用Demo1类的位置进行动态绑定bind(facade子类,子类所代理的类本身);
调用完bind()函数后就可以静态调用Demo1的动态方法了。
<?php
namespace app\index\controller;
class Index
{
public function test()
{
\think\Facade::bind('app\facade\Demo1','app\index\controller\Demo1');
return \app\facade\Demo1::getNum();
}
}
4.依赖注入和门面的对比:
假如目标是在一个控制器中获取GET请求参数
4.1 依赖注入的实现方式:
<?php
namespace app\index\controller;
class Index
{
public function test(\think\Request $request)
{
dump($request->get());
}
}
\think\Request $request === $request=new \think\Request();
4.2 门面(静态代理)的实现方式:
<?php
namespace app\index\controller;
class Index
{
public function test()
{
dump(\think\facade\Request::get());
}
}
4.3 使用父类的属性的实现方法:
继承Controller后,使用Controller类中的保护型属性$request(这是Request类实例)
<?php
namespace app\index\controller;
class Index extends \think\Controller
{
public function test ()
{
dump($this->request->get());
}
}
话说好想快点找到工作,呜呜。。。(´。_。`)