IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 【thinkphp】TP5的依赖注入/容器/门面的最基础概念和用法 -> 正文阅读

[PHP知识库]【thinkphp】TP5的依赖注入/容器/门面的最基础概念和用法


以下是关于 《最新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());
    }
}

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

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 11:33:57  更:2022-10-31 11:34:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/22 19:29:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码