例如,我有类说运行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...
}
}
答案 0 :(得分:2)
主要的想法是让类看起来像 black boxes ,这意味着一个局外人(即另一个持有该类实例的类或函数)不知道它是如何在内部工作的。它是抽象给他们。
查询的内部工作对于持有查询和调用->run()
的类并不重要,它只关心运行的查询,而不一定是它运行的方式和位置。
请注意,查询特别是低级抽象,它与直接调用标准库函数/对象相对接近。但是考虑到低级抽象,你可以进行更高级别的抽象。
例如,UserStore
,内部使用SqlQuery
个对象来获取和设置User
个对象到数据库中。使用UserStore
的班级不知道UserStore
在内部使用SqlQuery
个对象,它只知道它是一个可以保存和检索{{1}的对象对象。
这种"隐藏"和"封装"实际上为您提供了很多功能,因为现在类可以使用其他类而不依赖于具体的实现细节。如果明天您想要更改User
的存储方式,只需更改User
类,只要它具有相同的公共API ,你的应用程序的其余部分甚至不会意识到有些事情发生了变化。
答案 1 :(得分:1)
鉴于细节没有区别,但这取决于工作。当我必须创建一个无法直接访问但只能通过其使用方法的函数时,我会使用它很多次。它优化代码并拒绝代码外的访问。否则,任何人都可以改变可能有害的参数。