Php 将一个受保护的函数包装成一个做同样事情的公共函数的目的是什么?
我有一些遗留代码,我目前正在寻找削减,使其在新项目中可用。我遇到过以下类,其中包含许多受保护的方法,这些方法执行预期的功能,但它们是通过一个公共方法访问的,该方法只是像这样包装它们:Php 将一个受保护的函数包装成一个做同样事情的公共函数的目的是什么?,php,function,oop,inheritance,Php,Function,Oop,Inheritance,我有一些遗留代码,我目前正在寻找削减,使其在新项目中可用。我遇到过以下类,其中包含许多受保护的方法,这些方法执行预期的功能,但它们是通过一个公共方法访问的,该方法只是像这样包装它们: /** * method used to perform a fetch both using passed in SQL and optional params * @param string - SQL to be executed * @param array - optional - used if
/**
* method used to perform a fetch both using passed in SQL and optional params
* @param string - SQL to be executed
* @param array - optional - used if the query is to be prepared
* @return mixed - false on failure or array on success
**/
protected function _fetcharray($sql, $params = [])
{
//execute the query and return the results
return $this->execute($sql, $params)->fetch(PDO::FETCH_BOTH);
}
/**
* Public implementeation of __fetcharray
* @param string - SQL to be executed
* @param array - optional - used if the query is to be prepared
* @return mixed - false on failure or array on success
**/
public function fetcharray($sql, $params = [])
{
//execute the query and return the results
return $this->_fetcharray($sql, $params);
}
我可以理解,可能有必要私下做一些你不想公开的事情,但考虑到一个函数只调用另一个函数,这有什么意义。i、 e我在这里遗漏了什么?受保护函数的“所有者”可以安全地更改实现细节,甚至可以添加新的函数参数,因为它不会像直接更改公共函数那样破坏太多代码
从技术上讲,public
函数可以称为存根
如果内部函数被标记为private,那么封装的程度会更高。照目前的情况,这似乎毫无意义。作者可能打算在某个地方保留一些灵活性,并能够交换公共方法的实现细节。。。但在我看来,他们并不是一直在想这个问题 核心问题是API的稳定性。这意味着,一旦公开了一个
公共函数fetcharray($sql,$params=[])
,就会编写其他调用该函数的代码。如果您想在以后更改public
接口,即重命名函数或更改其参数的数量或含义,那么您会陷入困境,因为现在有一大堆其他代码取决于名称和参数的原样
但是,您仍然可以完全自由地完全更改函数的内部内容。只要函数名、参数和返回值不变,就可以随时从头重写函数
那么,使用“私有”实现并将public
函数代理给它有什么好处呢?没有一个它仍然要求您保持public
API的稳定性,并且它不会提供比其他方式更大的灵活性
也许作者打算继承类来调用
protected
函数,并让其他外部代码调用public
函数,这似乎是合理的;但是,他们没有为这一点提供任何理由,也没有为这两种不同功能之间的明确区别提供任何理由。如果protected
函数的行为与public
函数的行为略有不同,这可能会有某种意义;但既然他们没有,这似乎是一个简单的愚蠢行为。现在他们有两个API需要维护,而不是一个,可以说是降低了可维护性而不是增加了可维护性。正如其他答案所指出的,如果作者打算调整public
函数,这是有意义的(如果我们假设这里有意义的话),而受保护
功能保持绝对。因此,作者可以始终依赖于private
方法的预期行为,同时让其他开发人员在其实现中编辑公共方法
但是,这没有什么意义,因为受保护的功能本身仍然是可调的。作者可能应该将函数设置为private
和final
,以防止编辑
撇开意图不谈,这仍然是一个非常糟糕的实现,因为\u fetcharray
只是包装了执行
,假设\u fetcharray
中的下划线被用作“not public”的标准,它可能是一个public
方法。因此,您有一个public
方法,包装一个private
方法,包装一个public
方法,首先使用它总是更有意义的
我称之为意大利面食。这样做是为了让事情能经得起未来的考验。在实现时,没有什么可以保留的,因此内部方法也可以公开。然而,这种情况将来可能会改变,事情可能会变得更加复杂,可能需要分离。使用这种方法,可以在以后修改内部方法,而无需更改外部外观。