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知识库 -> PHP CI框架 (CodeIgniter) 中依赖注入和控制反转的实现方案和使用技巧 -> 正文阅读

[PHP知识库]PHP CI框架 (CodeIgniter) 中依赖注入和控制反转的实现方案和使用技巧

一、相关概念

依赖倒置(DIP)

DIP是一种设计思想,在传统的软件设计中,上层代码依赖下层,当下层代码发生改变的时候,上层代码也要发生改变,代码不易维护,而DIP设计思想要求定义上层接口,下层实现这个接口,从而降低耦合度,避免对原代码的侵入。

控制反转(IOC)

IOC是DIP的一种具体思路,将上层所依赖的下层交由第三方实现。也就是说,控制权转移,应用程序本身不负责依赖对象的创建和维护,而是有外部容器复制创建和维护。

依赖注入(DI)

DI是IOC的一种解耦组件之间依赖关系的设计模式,将类的依赖用另一个类来实例化,从而移到类的外部实现。

二、背景

说到换框架,有松耦合这些机制就尤为重要了。使用依赖注入(DI)就是实现松耦合的一个好方法,如果再配合上科学合理的架构设计,核心业务层可以几乎原封不动地移植到另一个使用DI的框架。

于是就有了对CI3引入一套流弊的依赖注入机制的想法,推荐?PHP-DI?相当成熟,功能强大。当初想,在不改动框架核心文件和不改变框架原有功能的前提下,把PHP-DI整合进来了,让在CI3.x上构建的项目可以使用依赖注入。此方案是基于不改CI框架核心代码的出发点非常不错的,不足的是实践中有一些问题,不得不放弃这种方案。有兴趣的同学可以参考这篇博文:https://zhuanlan.zhihu.com/p/98644060?

不推荐此方案原因

1. 本方案控制器实例会被初始化两次,多了一层资源的初始化,导致初始化方法里的代码多执行了一次,导致了又一次的无用计算资源开销。主要是初始化方法里,有许多校验逻辑。(主要原因)

2. 初始化方法中有许多全局常量定义,第二次初始化执行到他会报错

3. 第二次初始时,CI框架自动加载的自定义类库,会提示找不到文件

三、接入目的

PHP-DI提供了属性注入的方式,只要在容器配置文件里定义好就行,CI自动把控制器所需要的实例自动注册到控制器的属性上了。

四、CI框架集成

这里只针对CI框架,其他框架请参考?PHP-DI 官网?https://php-di.org/doc/frameworks/symfony2.html

1.? 使用Composer安装 PHP-DI?

composer require php-di/php-di

注:PHP-DI 需要 PHP 7.2 或更高版本

2. 接管控制器实例生成

核心方法,让DI容器生成控制器实例,而不是由框架直接new。修改 system/core/CodeIgniter.php 中的生成控制器实例的代码。

	$reg = 'cdi';
	$reg_file = APPPATH . 'config/'.$reg.'.php';
    $builder = new DI\ContainerBuilder;
    if(file_exists($reg_file)){
        $builder->addDefinitions($reg_file);
    }
    $CI = $builder->build()->get($class);

    //$CI = new $class(); // 注释CI本身的new方法,修改成DI容器生成控制器实例,也就是上边的代码

3. 依赖注册文件配置?

在application/config路径下安装DI容器配置文件cdi.php,这里以Test控制器类注入为例

use function DI\autowire;
use function DI\factory;
use function DI\create;
use function DI\get;
use App\models\ArticleRepository;
use App\libraries\CI_Instance as CI;
use App\third_party\Twig;


return [
    'Test' => autowire()
        ->property('user_service', get(UserService::class))
];

4. 使用

做如上简单的改造后,你就可以使用依赖注入了,这里我们用属性注入举例,其他更多方法参PHP-DI考官网的文档。

   /**
    * 属性注入
    * @var services\queue\UserService
    */
    private $user_service;


    public function i(){

        // 调用
        $this->user_service->test();
    }

五、总结

此方案,虽说我们改动了框架的核心源码,在鱼和熊掌不可兼得情况下,我们必须做出取舍,才能充分压榨出计算机的更多性能来。关于更多的依赖注入使用方法和最佳事件,请移步 PHP-DI 官网 https://php-di.org?,去充分挖掘最佳实战技巧。

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 11:55:25  更:2021-08-11 11:56:45 
 
开发: 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年5日历 -2024/5/10 20:12:24-

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