0

0

php之依赖注入和控制反转,php注入反转_PHP教程

php中文网

php中文网

发布时间:2016-07-12 08:52:57

|

1021人浏览过

|

来源于php中文网

原创

php之依赖注入和控制反转,php注入反转


    DI——Dependency Injection   依赖注入

    IoC——Inversion of Control  控制反转

   要想理解上面两个概念,就必须搞清楚如下的问题:

      1、参与者都有谁?  

立即学习PHP免费学习笔记(深入)”;

  答:一般有三方参与者,一个是某个对象;一个是IoC/DI的容器;另一个是某个对象的外部资源。又要名词解释一下,某个对象指的就是任意的、普通的Java对象; IoC/DI的容器简单点说就是指用来实现IoC/DI功能的一个框架程序;对象的外部资源指的就是对象需要的,但是是从对象外部获取的,都统称资源,比如:对象需要的其它对象、或者是对象需要的文件资源等等。

  2、依赖:谁依赖于谁?为什么会有依赖? 

  答:某个对象依赖于IoC/DI的容器。依赖是不可避免的,在一个项目中,各个类之间有各种各样的关系,不可能全部完全独立,这就形成了依赖。传统的开发是使用其他类时直接调用,这会形成强耦合,这是要避免的。依赖注入借用容器转移了被依赖对象实现解耦。

  3、注入:谁注入于谁?到底注入什么?

  答:通过容器向对象注入其所需要的外部资源

  4、控制反转:谁控制谁?控制什么?为什么叫反转?

  答: IoC/DI的容器控制对象,主要是控制对象实例的创建。反转是相对于正向而言的,那么什么算是正向的呢?考虑一下常规情况下的应用程序,如果要在A里面使用C,你会怎么做呢?当然是直接去创建C的对象,也就是说,是在A类中主动去获取所需要的外部资源C,这种情况被称为正向的。那么什么是反向呢?就是A类不再主动去获取C,而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A类中。

  5、依赖注入和控制反转是同一概念吗? 

  答:从上面可以看出:依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。

免费语音克隆
免费语音克隆

这是一个提供免费语音克隆服务的平台,用户只需上传或录制一段 5 秒以上的清晰语音样本,平台即可生成与用户声音高度一致的 AI 语音克隆。

下载

 

     下面我们通过例子来具体看看依赖注入的一些实现方式:

  1.构造器注入

<?<span>php
</span><span>class</span><span> Book {
   </span><span>private</span> <span>$db_conn</span><span>;
 
   </span><span>public</span> <span>function</span> __construct(<span>$db_conn</span><span>) {
       </span><span>$this</span>->db_conn = <span>$db_conn</span><span>;
   }
}</span>

  2、setter注入

<?<span>php<br>
  <br>class book{<br>     private $db;<br>   private $file;<br>     function setdb($db){<br>          $this->db=$db;<br>     }<br>     function setfile($file){<br>         $this->file=$file;<br>     }<br>}<br>class file{}<br>class db{}<br>...<br><br>class test{<br></span><span>    $book</span> = <span>new</span><span> Book();
    </span><span>$book</span>->setdb(<span>new db()</span><span>);  <br></span><span>      $book->setfile(new file());<br>}
</span>?>

  

  上面俩种方法代码很清晰,但是当我们需要注入很多个依赖时,意味着又要增加很多行,会比较难以管理。

  比较好的解决办法是 建立一个class作为所有依赖关系的container,在这个class中可以存放、创建、获取、查找需要的依赖关系

<?<span>php
</span><span>class</span><span> Ioc {
   </span><span>protected</span> <span>$db_conn</span><span>;
   </span><span>public</span> <span>static</span> <span>function</span><span> make_book() {
       </span><span>$new_book</span> = <span>new</span><span> Book();
       </span><span>$new_book</span>->set_db(self::<span>$db_conn</span><span>);
       </span><span>//</span><span>...
       //...
       //其他的依赖注入</span>
       <span>return</span> <span>$new_book</span><span>;
   }
}</span>

  此时,如果获取一个book实例,只需要执行$newone = Ioc::makebook();

  以上是container的一个具体实例,最好还是不要把具体的某个依赖注入写成方法,采用registry注册,get获取比较好

<?<span>php
</span><span>class</span><span> Ioc {
</span><span>/*</span><span>*
* @var 注册的依赖数组
</span><span>*/</span>
 
   <span>protected</span> <span>static</span> <span>$registry</span> = <span>array</span><span>();
 
   </span><span>/*</span><span>*
    * 添加一个resolve到registry数组中
    * @param  string $name 依赖标识
    * @param  object $resolve 一个匿名函数用来创建实例
    * @return void
    </span><span>*/</span>
   <span>public</span> <span>static</span> <span>function</span> register(<span>$name</span>, Closure <span>$resolve</span><span>)
   {
      </span><span>static</span>::<span>$registry</span>[<span>$name</span>] = <span>$resolve</span><span>;
   }
 
   </span><span>/*</span><span>*
     * 返回一个实例
     * @param  string $name 依赖的标识
     * @return mixed
     </span><span>*/</span>
   <span>public</span> <span>static</span> <span>function</span> resolve(<span>$name</span><span>)
   {
       </span><span>if</span> ( <span>static</span>::registered(<span>$name</span><span>) )
       {
          </span><span>$name</span> = <span>static</span>::<span>$registry</span>[<span>$name</span><span>];
          </span><span>return</span> <span>$name</span><span>();
       }
       </span><span>throw</span> <span>new</span> <span>Exception</span>('Nothing registered with that name, fool.'<span>);
   }
   </span><span>/*</span><span>*
    * 查询某个依赖实例是否存在
    * @param  string $name id
    * @return bool 
    </span><span>*/</span>
   <span>public</span> <span>static</span> <span>function</span> registered(<span>$name</span><span>)
   {
      </span><span>return</span> <span>array_key_exists</span>(<span>$name</span>, <span>static</span>::<span>$registry</span><span>);
   }
}</span>

  现在就可以通过如下方式来注册和注入一个

<?<span>php
</span><span>$book</span> = Ioc::registry('book', <span>function</span><span>(){
</span><span>$book</span> = <span>new</span><span> Book;
</span><span>$book</span>->setdb('...'<span>);
</span><span>$book</span>->setprice('...'<span>);
</span><span>return</span> <span>$book</span><span>;
});
 
</span><span>//</span><span>注入依赖</span>
<span>$book</span> = Ioc::resolve('book'<span>);
</span>?>

     

  参考:http://www.4wei.cn/archives/1002316

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1125521.htmlTechArticlephp之依赖注入和控制反转,php注入反转 DIDependency Injection 依赖注入 IoCInversion of Control 控制反转 要想理解上面两个概念,就必须搞清楚如下...

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

16

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

23

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

75

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

95

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

218

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

420

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

168

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

222

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

33

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.3万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号