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 相关文章推荐
使用Apache的rewrite技术
Jun 22 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
Sep 15 PHP
yii框架中的Url生产问题小结
Jan 16 PHP
PHP中::、-&amp;gt;、self、$this几种操作符的区别介绍
Apr 24 PHP
PHP常用技术文之文件操作和目录操作总结
Sep 27 PHP
PHP调用MySQL存储过程并返回值的方法
Dec 26 PHP
php实现在限定区域里自动调整字体大小的类实例
Apr 02 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
Apr 05 PHP
php之header的不同用法总结(实例讲解)
Nov 28 PHP
解决Laravel自定义类引入和命名空间的问题
Oct 15 PHP
Laravel 框架路由原理与路由访问实例分析
Apr 14 PHP
PHP isset()及empty()用法区别详解
Aug 29 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
火车头采集器3.0采集图文教程
2007/03/17 PHP
PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
2011/03/23 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
2017/05/24 PHP
使用PHPExcel导出Excel表
2018/09/08 PHP
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
基于jQuery实现响应式圆形图片轮播特效
2015/11/25 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
Bootstrap项目实战之子栏目资讯内容
2016/04/25 Javascript
jQuery代码实现实时获取时间
2017/01/29 Javascript
jquery uploadify隐藏上传进度的实现方法
2017/02/06 Javascript
轻松实现jQuery添加删除按钮Click事件
2017/03/13 Javascript
Node之简单的前后端交互(实例讲解)
2017/11/14 Javascript
js canvas实现画图、滤镜效果
2018/11/27 Javascript
nodejs基础之多进程实例详解
2018/12/27 NodeJs
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
Python向日志输出中添加上下文信息
2017/05/24 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
Python实现简单文本字符串处理的方法
2018/01/22 Python
python将回车作为输入内容的实例
2018/06/23 Python
详解python 注释、变量、类型
2018/08/10 Python
python3实现名片管理系统
2020/11/29 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
2019/08/30 Python
英国最大的百货公司:Harrods
2016/08/18 全球购物
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
创新社会管理心得体会
2014/09/12 职场文书
公司委托书格式范本
2014/09/16 职场文书
教师党员学习十八届四中全会思想汇报
2014/11/03 职场文书
劳动者解除劳动合同通知书
2015/04/16 职场文书
总经理年会致辞
2015/07/29 职场文书
python requests模块的使用示例
2021/04/07 Python
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python
Python绘制散乱的点构成的图的方法
2022/04/21 Python