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 相关文章推荐
第十三节 对象串行化 [13]
Oct 09 PHP
选择PHP作为网站开发语言的原因分享
Jan 03 PHP
XAMPP安装与使用方法详细解析
Nov 27 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
Jul 01 PHP
PHPStorm+XDebug进行调试图文教程
Jun 13 PHP
详谈PHP程序Laravel 5框架的优化技巧
Jul 18 PHP
php自定义函数实现汉字转换utf8编码的方法
Sep 29 PHP
PHP环境搭建(php+Apache+mysql)
Nov 14 PHP
PHP简单读取xml文件的方法示例
Apr 20 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
Sep 13 PHP
PHP设计模式之模板模式定义与用法详解
Dec 20 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
Feb 10 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
php对数组内元素进行随机调换的方法
2015/05/12 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
2011/03/12 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
jquery中通过父级查找进行定位示例
2013/06/28 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
PageSwitch插件实现100种不同图片切换效果
2015/07/28 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
2015/12/04 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
微信小程序 动态传参实例详解
2017/04/27 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
JS实现分页导航效果
2020/02/19 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
玩转python爬虫之URLError异常处理
2016/02/17 Python
基于Django的ModelForm组件(详解)
2017/12/07 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
Django中反向生成models.py的实例讲解
2018/05/30 Python
无法使用pip命令安装python第三方库的原因及解决方法
2018/06/12 Python
教你如何编写、保存与运行Python程序的方法
2019/07/12 Python
python能做什么 python的含义
2019/10/12 Python
python SVD压缩图像的实现代码
2019/11/05 Python
为什么称python为胶水语言
2020/06/16 Python
结合CSS3的布局新特征谈谈常见布局方法
2016/01/22 HTML / CSS
HTML5本地存储之IndexedDB
2017/06/16 HTML / CSS
汽车检测与维修应届毕业生求职信
2013/10/19 职场文书
给老师的一封建议书
2014/03/13 职场文书
工商管理本科生求职信
2014/07/13 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
2014年行政后勤工作总结
2014/12/06 职场文书
爱心捐款感谢信
2015/01/20 职场文书
大学生读书笔记大全
2015/07/01 职场文书
ES6 解构赋值的原理及运用
2021/05/25 Javascript
zabbix监控mysql的实例方法
2021/06/02 MySQL
python随机打印成绩排名表
2021/06/23 Python
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python