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 相关文章推荐
PHP5 的对象赋值机制介绍
Aug 02 PHP
php 团购折扣计算公式
Nov 24 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
Jul 19 PHP
解析func_num_args与func_get_args函数的使用
Jun 24 PHP
php curl_init函数用法
Jan 31 PHP
php禁止某ip或ip地址段访问的方法
Feb 25 PHP
PHP验证信用卡卡号是否正确函数
May 27 PHP
在PHP中使用FastCGI解析漏洞及修复方案
Nov 10 PHP
PHP5.2中PDO的简单使用方法
Mar 25 PHP
PHP基于openssl实现的非对称加密操作示例
Jan 11 PHP
浅析PHP echo 和 print 语句
Jun 30 PHP
phpquery中文手册
Mar 18 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
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
php-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
php ajax 静态分页过程形式
2011/09/02 PHP
PHP自定义多进制的方法
2016/11/03 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
js输出列表实现代码
2010/09/12 Javascript
JavaScript 产生不重复的随机数三种实现思路
2012/12/13 Javascript
jquery插件之定时查询待处理任务数量
2014/05/01 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
微信小程序 获取session_key和openid的实例
2017/08/17 Javascript
如何根据业务封装自己的功能组件
2019/04/19 Javascript
VUE 自定义组件模板的方法详解
2019/08/30 Javascript
js实现图片上传即时显示效果
2019/09/30 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
Vue中fragment.js使用方法小结
2020/02/17 Javascript
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
Python工程师面试必备25条知识点
2018/01/17 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
2019/08/08 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
python实现无边框进度条的实例代码
2020/12/30 Python
斯凯奇澳大利亚官网:SKECHERS澳大利亚
2018/03/31 全球购物
大学校园毕业自我鉴定
2014/01/15 职场文书
劳动竞赛活动方案
2014/02/20 职场文书
大学英语专业求职信
2014/06/21 职场文书
2015年党风建设工作总结
2015/04/29 职场文书
初婚未育证明样本
2015/06/18 职场文书
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL