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 相关文章推荐
BBS(php &amp; mysql)完整版(一)
Oct 09 PHP
关于时间计算的结总
Dec 06 PHP
浅谈apache和nginx的rewrite的区别
Feb 22 PHP
PHP和.net中des加解密的实现方法
Feb 27 PHP
PHP常用编译参数中文说明
Sep 27 PHP
彻底删除thinkphp3.1案例blog标签的方法
Dec 05 PHP
PHP中字符安全过滤函数使用小结
Feb 25 PHP
php实现通用的从数据库表读取数据到数组的函数实例
Mar 21 PHP
WampServer搭建php环境时遇到的问题汇总
Jul 23 PHP
php+mysql实现无限级分类
Nov 11 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
PHP中国际化的字符串排序和比较对象详解
Aug 23 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代码运行时间查看类代码分享
2011/08/06 PHP
thinkphp配置连接数据库技巧
2014/12/02 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
jQuery使用数组编写图片无缝向左滚动
2012/12/11 Javascript
jquery获取复选框被选中的值
2014/03/22 Javascript
Bootstrap入门书籍之(四)菜单、按钮及导航
2016/02/17 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
javascript insertAfter()定义与用法示例
2016/07/25 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
Bootstrap 模态框实例插件案例分析
2016/12/28 Javascript
微信小程序 缓存(本地缓存、异步缓存、同步缓存)详解
2017/01/17 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
详解用node搭建简单的静态资源管理器
2017/08/09 Javascript
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
jquery在启动页面时,自动加载数据的实例
2018/01/22 jQuery
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
[05:42]DOTA2英雄梦之声_第10期_蝙蝠骑士
2014/06/21 DOTA
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
Python常用小技巧总结
2015/06/01 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
PyCharm配置mongo插件的方法
2018/11/30 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
python实现按关键字筛选日志文件
2019/12/24 Python
Python 实现一个计时器
2020/07/28 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
SQL Server笔试题
2012/01/10 面试题
linux面试题参考答案(5)
2016/11/05 面试题
某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults,usrquota 1 2 请解释其含义
2013/09/18 面试题
简述进程的启动、终止的方式以及如何进行进程的查看
2014/02/20 面试题
九年级数学教学反思
2014/02/02 职场文书
投资协议书范本
2014/04/21 职场文书
食品安全演讲稿
2014/09/01 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js