PHP经典设计模式之依赖注入定义与用法详解


Posted in PHP onMay 21, 2019

本文实例讲述了PHP经典设计模式之依赖注入定义与用法。分享给大家供大家参考,具体如下:

依赖注入的实质就是把一个类不可能更换的部分可更换的部分分离开来,通过注入的方式来使用,从而达到解耦的目的。

一个数据库连接类:

class Mysql{
 private $host;
 private $prot;
 private $username;
 private $password;
 private $db_name;
 // 构造方法
 public function __construct(){
   $this->host = '127.0.0.1';
   $this->port = 22;
   $this->username = 'root';
   $this->password = '';
   $this->db_name = 'my_db';
 }
 // 连接
 public function connect(){
   return mysqli_connect($this->host,$this->username,$this->password,$this->db_name,$this->port);
 }
}

使用这个类:

$db = new Mysql();
$db->connect();

通常数据库连接类应该设计为单列,这里先不要搞复杂了。

依赖注入

显然,数据库的配置是可以更换的部分,因此我们需要先把它拎出来:

class MysqlConfiguration{
  private $host;
  private $prot;
  private $username;
  private $password;
  private $db_name;
  public function __construct($host,$port,$username,$password,$db_name){
    $this->host = $host;
    $this->port = $port;
    $this->username = $username;
    $this->password = $password;
    $this->db_name = $db_name;
  }
  public function getHost(){
    return $this->host;
  }
  public function getPort(){
    return $this->port();
  }
  public function getUsername(){
    return $this->username;
  }
  public function getPassword(){
    return $this->password;
  }
  public function getDbName(){
    return $this->db_name;
  }
}

然后不可替换的部分这样:

class Mysql{
 private $configuration;
 public function __construct($config){
   $this->configuration = $config;
 }
 // 连接
 public function connect(){
   return mysqli_connect($this->configuration->getHost(),$this->configuration->getUsername(),$this->configuration->getPassword(),$this->configuration->getDbName(),$this->configuration->getPort());
 }
}

这样就完成了配置文件和连接逻辑的分离。

使用

$config = new MysqlConfiguration('127.0.0.1','root','password','my_db',22);
// $config是注入Mysql的,这就是所谓的依赖注入
$db = new Mysql($config);
$db->connect();

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

PHP 相关文章推荐
PHP个人网站架设连环讲(一)
Oct 09 PHP
PHP静态调用非静态方法的应用分析
May 02 PHP
mac下安装nginx和php
Nov 04 PHP
thinkphp的静态缓存用法分析
Nov 29 PHP
php利用事务处理转账问题
Apr 22 PHP
php使用gzip压缩传输js和css文件的方法
Jul 29 PHP
基于PHP如何把汉字转化为拼音
Dec 11 PHP
php实现背景图上添加圆形logo图标的方法
Nov 17 PHP
thinkPHP实现多字段模糊匹配查询的方法
Dec 01 PHP
php使用crypt()函数进行加密
Jun 08 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
May 23 PHP
laravel框架数据库配置及操作数据库示例
Oct 10 PHP
PHP常见过waf webshell以及最简单的检测方法
May 21 #PHP
PHP __call()方法实现委托示例
May 20 #PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 #PHP
PHP常量define和const的区别详解
May 18 #PHP
thinkphp5框架实现的自定义扩展类操作示例
May 16 #PHP
java解析json方法总结
May 16 #PHP
微信支付之JSAPI公众号支付详解
May 15 #PHP
You might like
php_xmlhttp 乱码问题解决方法
2009/08/07 PHP
php实现评论回复删除功能
2017/05/23 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
2010/09/03 Javascript
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
2010/09/10 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
jquery+css实现绚丽的横向二级下拉菜单-附源码下载
2015/08/23 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
jquery实现具有收缩功能的垂直导航菜单
2016/02/16 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
把普通对象转换成json格式的对象的简单实例
2016/07/04 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
Koa日志中间件封装开发详解
2019/03/09 Javascript
ES6模板字符串和标签模板的应用实例分析
2019/06/25 Javascript
js实现简单页面全屏
2019/09/17 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
2021/02/26 Vue.js
Python标准库内置函数complex介绍
2014/11/25 Python
浅谈Tensorflow模型的保存与恢复加载
2018/04/26 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
高考考python编程是真的吗
2020/07/20 Python
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
期末学生评语大全
2014/04/24 职场文书
艾滋病宣传标语
2014/06/25 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
2014年群众路线教育实践活动整改措施
2014/09/24 职场文书
社区党员干部承诺书
2015/05/04 职场文书
理想国读书笔记
2015/06/25 职场文书
公安干警正风肃纪心得体会
2016/01/15 职场文书
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python