文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【thinkphp】TP5的依赖注入/容器/门面的最基础概念和用法

2023-09-03 13:02

关注

文章目录


以下是关于 《最新ThinkPHP 5.1全球首发视频教程》的第4章的笔记

1.什么是依赖注入?

1.1 依赖注入的概念:

依赖注入指的是将对象类型的数据以参数的方式传到一个方法的参数列表中

1.2 依赖注入的举例:

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对象。

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

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的方法

namespace app\index\controller;class Demo1{    private $num=123;    public function getNum()    {        return $this->num;    }}

创建一个Facade类的子类,用来静态代理Demo1类(建议同名因为便于管理)

namespace app\facade;class Demo1 extends \think\Facade{    //重写Facade类的getFacadeClass函数,直接返回本子类所代理的真正类的命名空间    protected static function getFacadeClass()    {        return '\app\index\controller\Demo1';    }}

代理完毕,现在在别的类中可以直接静态调用Demo1的方法

namespace app\index\controller;use app\facade\Demo1;class Index{    public function test(){        return Demo1::getNum();    }}

如果上面的形式觉得不够灵活,可以换成动态绑定代理关系,如下:

首先让刚才创建的Facade的子类中的内容为空

namespace app\facade;class Demo1 extends \think\Facade{}

然后在需要调用Demo1类的位置进行动态绑定bind(facade子类,子类所代理的类本身);

调用完bind()函数后就可以静态调用Demo1的动态方法了。

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 依赖注入的实现方式:

namespace app\index\controller;class Index{    public function test(\think\Request $request)    {        dump($request->get());    }}

\think\Request $request === $request=new \think\Request();

4.2 门面(静态代理)的实现方式:

namespace app\index\controller;class Index{    public function test()    {        dump(\think\facade\Request::get());    }}

4.3 使用父类的属性的实现方法:

继承Controller后,使用Controller类中的保护型属性$request(这是Request类实例)

namespace app\index\controller;class Index extends \think\Controller{    public function test ()    {        dump($this->request->get());    }}

话说好想快点找到工作,呜呜。。。(´。_。`)

来源地址:https://blog.csdn.net/cherry_boat/article/details/127572402

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯