Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是PHP封装的良好实践吗?_Php_Class_Oop_Encapsulation - Fatal编程技术网

这是PHP封装的良好实践吗?

这是PHP封装的良好实践吗?,php,class,oop,encapsulation,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 implementatio

例如,我有一个运行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...

  }

}

给定的细节没有区别,但取决于工作。当我必须创建一个不能直接访问的函数,而只能通过使用该函数的方法访问时,我经常使用它。它优化代码并拒绝代码之外的访问。否则任何人都可以改变可能有害的参数。

给定的细节没有区别,但取决于工作。当我必须创建一个不能直接访问的函数,而只能通过使用该函数的方法访问时,我经常使用它。它优化代码并拒绝代码之外的访问。否则,任何人都可以更改可能有害的参数。

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

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

请注意,查询是非常低级的抽象,它相对接近于直接调用标准库函数/对象。但是考虑到这种低层次的抽象,您可以进行更高层次的抽象

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


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

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

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

请注意,查询是非常低级的抽象,它相对接近于直接调用标准库函数/对象。但是考虑到这种低层次的抽象,您可以进行更高层次的抽象

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


这种“隐藏”和“封装”实际上给了您很大的能力,因为现在类可以使用其他类而不依赖于具体的实现细节。如果明天您想更改存储
User
s的方式,您只需更改
UserStore
类,只要它具有相同的公共API,应用程序的其余部分甚至不会意识到有什么改变。

我看不出有任何理由在给定代码中包装
runQuery()
。为什么您认为需要使用这种包装器使代码复杂化?=)什么是封装?那么你能给我一个例子吗?我看不出有任何理由在给定的代码中包装
runQuery()
。为什么您认为需要使用这种包装器使代码复杂化?=)你能给我一个例子吗?你能提供一个例子吗?我经常用它来写电子邮件,一种私人的方法,只有在特定条件下才能用其他方法发送。这是一个例子。你能提供一个例子吗?我经常用它来发电子邮件,这是一种私人方法,只有在特定条件下才能用其他方法发送。这是一个例子我得到了这个理论,我的问题更多的是关于PHP的实现,您认为应该使用我提供的第一个或第二个代码示例吗?哦,抱歉。具体来说,创建一个只委托给具有相同签名的私有函数的公共函数没有任何好处。您可以使用对私有函数的委托来从多个方法中抽象出类似的功能(例如,
select()
update()这两种功能的公共部分)
我的问题是需要准备查询,这可能是一个公共调用的私有函数,以从中获得一些服务。我得到了理论,我的问题更多的是关于PHP的实现。您认为应该使用我提供的第一个或第二个代码示例吗?为什么。哦,抱歉。特别是,使用公共函数t仅委托给具有相同签名的私有函数。您可以使用委托给私有函数从多个方法中抽象出类似的功能(例如