这是PHP中封装的好习惯吗?

时间:2016-11-02 17:19:13

标签: php class oop encapsulation

例如,我有类说运行MySQL查询,我想封装这个类。

class SqlQuery {

  private $database_connection_obj;

  public function __construct($dbh) {
     $this->$database_connection_obj = $dbh;
  }

  public function runQuery($query, $params) {

     //run query implementation...

  }

}

封装和信息隐藏意味着我想关闭对类方法的直接访问,因此函数runQuery()不应该是公共的,所以我将其设为私有并添加方法exacuteQuery(),其唯一目的是将数据传递给私有函数runQuery()

这样做的实际用途是什么,因为最后它的工作原理与上面的代码完全相同。 在传递给私有方法之前,是否应该在公共方法中完成输入数据的一些卫生,或者为什么要编写这个额外的代码?

class SqlQuery {

  private $database_connection_obj;

  public function __construct($dbh) {
     $this->$database_connection_obj = $dbh;
  }

  public function exacuteQuery($external_query, $external_params) {
     $this->runQuery($external_query, $external_params);
  }    

  private function runQuery($query, $params) {

     //run query implementation...

  }

}

2 个答案:

答案 0 :(得分:2)

主要的想法是让类看起来像 black boxes ,这意味着一个局外人(即另一个持有该类实例的类或函数)不知道它是如何在内部工作的。它是抽象给他们。

查询的内部工作对于持有查询和调用->run()的类并不重要,它只关心运行的查询,而不一定是它运行的方式和位置。

请注意,查询特别是低级抽象,它与直接调用标准库函数/对象相对接近。但是考虑到低级抽象,你可以进行更高级别的抽象。

例如,UserStore,内部使用SqlQuery个对象来获取和设置User个对象到数据库中。使用UserStore的班级不知道UserStore在内部使用SqlQuery个对象,它只知道它是一个可以保存和检索{{1}的对象对象。

这种"隐藏"和"封装"实际上为您提供了很多功能,因为现在类可以使用其他类而不依赖于具体的实现细节。如果明天您想要更改User的存储方式,只需更改User类,只要它具有相同的公共API ,你的应用程序的其余部分甚至不会意识到有些事情发生了变化。

答案 1 :(得分:1)

鉴于细节没有区别,但这取决于工作。当我必须创建一个无法直接访问但只能通过其使用方法的函数时,我会使用它很多次。它优化代码并拒绝代码外的访问。否则,任何人都可以改变可能有害的参数。