首页 > 开发 > PHP > 正文

PHP面向对象五大原则之单一职责原则(SRP)详解

2024-05-04 22:43:41
字体:
来源:转载
供稿:网友

本文实例讲述了PHP面向对象五大原则之单一职责原则(SRP)。分享给大家供大家参考,具体如下:

单一职责原则(Single Pesponsibility Principle, SRP)

单一职责有两个含义: 一个是避免相同的职责分散到不同的类中, 别一个是避免一个类承担太多职责

为什么要遵守SRP呢?

(1)可以减少类之间的耦合

如果减少类之间的耦合,当需求变化时,只修改一个类,从而也就隔离了变化;如果一个类有多个不同职责,它们耦合在一起,当一个职责发生变化时,可能会影响到其他职责。

(2)提高类的复用性

修改电脑比修理电视机简单多了。主要原因就在于电视机各个部件之间的耦合性太高,而电脑则不同,电脑的内存、硬盘、声卡、网卡、键盘灯等部件都可以很容易地单独拆卸和组装。某个部件坏了,换上新的即可。上面的例子就体现了单一职责的优势。由于使用了单一职责,使得‘组件'可以方便地‘拆卸'和‘组装'。

不遵守SRP会影响对类的复用性。当只需要用该类的某一个职责时,由于它和其他的职责耦合在一起,也就很难分离出。

遵守SRP在实际代码开发中有没有什么应用?有的。以数据持久层为例,所谓的数据持久层主要指的是数据库操作,当然,还包括缓存管理等。这时就需要数据持久层支持多种数据库。应该怎么做?定义多个数据库操作类?想法已经很接近了,再进一步,就是使用工厂模式。

工厂模式(Faction)允许你在代码执行时实例化对象。它之所以被称为工厂模式是因为它负责‘生产对象'。以数据库为例,工厂需要的就是根据不同的参数,生成不同的实例化对象。最简单的工厂就是根据传入的类型名实例化对象,如传入MySQL,就调用MySQL类并实例化,如果是SQLite,则调用 SQLite的类并实例化,甚至还可以处理TXT、Execl等‘类数据库'。

工厂类也就是这样的一个类,它只负责生产对象,而不负责对象的具体内容。

以下是示例

定义一个适配器的接口

interface Db_Adpater{  /**   * 数据库连接   * @param $config 数据库配置   * @return mixed resource   */  public function connect($config);  /**   * 执行数据库查询   * @param $query 数据库查询的SQL字符串   * @param $handle 连接对象   * @return mixed   */  public function query($query,$handle);}

定义一个实现了DB_Adpater接口的MySQL数据库操作类

class Db_Adapter_Mysql implements Db_Adpater{  private $_dbLink;  //数据库连接字符串标识  /**   * 数据库连接函数   * @param $config 数据库配置   * @return resource   * @throws Db_Exception   */  public function connect($config)  {    if($this->_dbLink = @mysql_connect($config->host . (empty($config->port) ? '' : ':' . $config->prot) ,$config->user, $config->password, true))    {      if(@mysql_select_db($config->database, $this->_dbLink))      {        if($config->charset)        {          mysql_query("SET NAME '{$config->charset}'", $this->_dbLink);        }        return $this->_dbLink;      }    }    throw new Db_Exception(@mysql_error($this->_dbLink));  }  /**   * 执行数据库查询   * @param $query 数据库查询SQL字符串   * @param $handle 连接对象   * @return resource   */  public function query($query,$handle)  {    if($resource = @mysql_query($query,$handle))      return $resource;  }}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表