php中的依赖注入实例详解


Posted in PHP onAugust 14, 2019

本文实例讲述了php中的依赖注入。分享给大家供大家参考,具体如下:

依赖注入是一种允许我们从硬编码的依赖中解耦出来,从而在运行时或者编译时能够修改的软件设计模式。

我到现在依然不大明白上面“依赖注入”的定义是什么……

有兴趣可以参考下《PHP之道》上面对“依赖注入”的 解释。
http://laravel-china.github.io/php-the-right-way/#dependency_injection

简而言之就是可以让我们在类的方法中更加方便的调用与之关联的类。

假设我们有一个这样的类

class Test
{
 public function index(Demo $demo,Apple $apple){
  $demo->show();
  $apple->fun();
 }
}

如果想使用index方法我们一般需要这样做。

$demo = new Demo();
$apple = new Apple();
$obj = new Test();
$obj->index($demo,$apple);

index方法调用起来是不是很麻烦?上面的方法还只是有两个参数,如果有更多的参数,我们就要实例化更多的对象作为参数。如果我们引入的“依赖注入”,调用方式将会是像下面这个样子。

$obj = new dependencyInjection();
$obj->fun("Test","index");

我们上面的例子中,Test类的index方法依赖于Demo和Apple类。

“依赖注入”就是识别出所有方法“依赖”的类,然后作为参数值“注入”到该方法中。

dependencyInjection类就是完成这个依赖注入任务的。

<?php
/**
 * Created by PhpStorm.
 * User: zhezhao
 * Date: 2016/8/10
 * Time: 19:18
 */
class dependencyInjection
{
 function fun($className,$action){
  $reflectionMethod = new ReflectionMethod($className,$action);
  $parammeters = $reflectionMethod->getParameters();
  $params = array();
  foreach ($parammeters as $item) {
   preg_match('/> ([^ ]*)/',$item,$arr);
   $class = trim($arr[1]);
   $params[] = new $class();
  }
  $instance = new $className();
  $res = call_user_func_array([$instance,$action],$params);
  return $res;
 }
}

在mvc框架中,control有时会用到多个model。如果我们使用了依赖注入类的自动加载之后,我们就可以像下面这样使用。

public function index(UserModel $userModel,MessageModel $messageModel){
 $userList = $userModel->getAllUser();
 $messageList = $messageModel->getAllMessage();
}

灰常方便~

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
需要发散思维学习PHP
Jun 29 PHP
延长phpmyadmin登录时间的方法
Feb 06 PHP
php smarty 二级分类代码和模版循环例子
Jun 01 PHP
thinkphp的c方法使用示例
Feb 24 PHP
一个显示效果非常不错的PHP错误、异常处理类
Mar 21 PHP
php中in_array函数用法探究
Nov 25 PHP
PHP响应post请求上传文件的方法
Dec 17 PHP
PHP二维数组去重实例分析
Nov 18 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
Mar 14 PHP
PHP获取数组中单列值的方法
Jun 10 PHP
php PDO属性设置与操作方法分析
Dec 27 PHP
PHP实现一个轻量级容器的方法
Jan 28 PHP
php基于 swoole 实现的异步处理任务功能示例
Aug 13 #PHP
thinkphp3.2框架中where条件查询用法总结
Aug 13 #PHP
thinkphp5框架结合mysql实现微信登录和自定义分享链接与图文功能示例
Aug 13 #PHP
php实现的表单验证类完整示例
Aug 13 #PHP
thinkphp3.2同时连接两个数据库的简单方法
Aug 13 #PHP
php实现简单的守护进程创建、开启与关闭操作
Aug 13 #PHP
Laravel如何同时连接多个数据库详解
Aug 13 #PHP
You might like
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
PHP 组件化编程技巧
2009/06/06 PHP
PHP 翻页 实例代码
2009/08/07 PHP
常见的PHP五种设计模式小结
2011/03/23 PHP
mysql总结之explain
2012/02/27 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
thinkPHP5分页功能实现方法分析
2017/10/25 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
js单例模式的两种方案
2013/10/22 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
JS+CSS实现仿支付宝菜单选中效果代码
2015/09/25 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
vue-cli+webpack在生成的项目中使用bootstrap实例代码
2017/05/26 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
浅谈react.js中实现tab吸顶效果的问题
2017/09/06 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
vue中解决微信html5原生ios虚拟键返回不刷新问题
2020/10/20 Javascript
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
mac系统安装Python3初体验
2018/01/02 Python
python查询mysql,返回json的实例
2018/03/26 Python
python保存文件方法小结
2018/07/27 Python
对Python3 goto 语句的使用方法详解
2019/02/16 Python
python调用外部程序的实操步骤
2019/03/04 Python
Django框架验证码用法实例分析
2019/05/10 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
为什么相对PHP黑python的更少
2020/06/21 Python
css3.0新属性效果在ie下的解决方案
2010/05/10 HTML / CSS
Booking.com德国:预订最好的酒店和住宿
2020/02/16 全球购物
2014年党员教师自我剖析材料
2014/09/30 职场文书
篮球拉拉队口号
2015/12/25 职场文书
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python
详解Java实践之建造者模式
2021/06/18 Java/Android