Php 面向对象方法桥

Php 面向对象方法桥,php,oop,Php,Oop,我的系统中的一些资源使用基于Java集合的对象集合概念 这个集合类抽象为另一个称为列表的具体类提供了基本功能,该类允许通过集合的索引查找对象 我将使用我的HTTP Headers类作为示例来解释 我在它的构造函数中有一个List类的实例。每个HTTP标头字段都通过Headers::addHeader方法添加到集合中 显然,我有一个名为getHeaders的getter方法,它返回集合的存储,而不是集合的对象 因此,如果我需要列出这个类之外的头,我只需要调用$obj->getHeaders,我就有

我的系统中的一些资源使用基于Java集合的对象集合概念

这个集合类抽象为另一个称为列表的具体类提供了基本功能,该类允许通过集合的索引查找对象

我将使用我的HTTP Headers类作为示例来解释

我在它的构造函数中有一个List类的实例。每个HTTP标头字段都通过Headers::addHeader方法添加到集合中

显然,我有一个名为getHeaders的getter方法,它返回集合的存储,而不是集合的对象

因此,如果我需要列出这个类之外的头,我只需要调用$obj->getHeaders,我就有一个添加了所有对象的ArrayObject

好的

但是,最近出现了使用List方法之一Lists::find的必要性,该方法查找对象时甚至不知道对象的名称或其在集合存储中的特定位置

由于Lists对象位于私有属性中,Headers::getHeaders返回集合存储,我不想违反封装,通过将该属性设置为公共属性,我无法访问此方法

除了功能之外,我编写的所有代码都必须在视觉上优雅,并创建另一个getter方法,比如说getHeaderLists将生成如下调用:

$obj -> getHeadersLists() -> find( 'foo' );
这太难看了

因此,我很快在Headers类中添加了一个_调用,效果很好:

$obj -> find( 'foo' );
但我认识的一个非常精通面向对象主题的人告诉我这是错误的

我的论点纯粹集中在可读性上,他在面向对象、魔术方法和可读性不能共存的问题上进行了反驳

那又怎样?我应该怎么做才能在这两个类之间建立这座桥梁,而不使用_调用并保留面向对象的原则

我知道,我可以在Headers::getHeaders中返回Collection对象,并使用如下方法:

$obj -> getHeaders() -> find();

但我在面向对象方面学到的是责任。正如它的声明所说,这个方法的责任是返回所有添加的头,而不是外部对象。

这就是为什么在PHP中像其他O.O.编程语言一样有一个受保护的作用域

若您知道,受保护的成员可以由子类访问,但不能作为公共访问


作为建议,我通常不使用private,而是protected,原因与您的帖子相同。

我打算用Bob叔叔的单一责任原则a.k.a s.O.L.I.D.的大s.来攻击您,您可以在文章中阅读更多内容。也可以直接回答你的问题

当您隐藏getHeaders函数调用(返回和类型为列表的对象)时,问题在于,您似乎正在调用该对象,并且它有一个名为find的函数,该函数不应具有,因为他不负责查找正确的头

我能理解你的责任态度

你说:当我调用getHeaders时,不应该强迫我进一步操纵结果以得到我想要的

你的这个建议完全正确。但是为了得到这个结果,用syntactic sugar隐藏getHeaders函数调用是完全错误的,因为这会误导我

假设我是阅读您代码的第三方,我会立即假设该类有一个find函数,这是非常误导的。另外,我会拒绝这个find函数,因为从标题列表中进行查找并不需要对象的责任,这只是一个不必要的附加项或错误。所以你的同事也是对的:D

我相信,在这里,迫使您调用find来使用Headers类型对象的情况是罪魁祸首

我对你的困境的建议是这样的

这个对象应该有一个名为getHeaders的函数。不要改变这一点。它应该返回所有标题。 创建第二个函数,名为getRelatedHeadersfoo或getFooHeaders,它以封装的方式在内部调用getHeaders,然后对其使用findfoo并返回foo头。 现在只剩下一个小建议了,我的朋友。我相信你的讨论引发了一个更有趣的问题,你和你的队友应该问这个问题

几乎总是,如果你需要得到一个对象的一些属性并对它们采取行动。然后,您还应该能够将该功能封装到该对象/类中。当您获得一个objects属性并使用它做一些事情,然后将其放回去时,几乎总是一种代码味道

为什么那个物体不履行他的职责,而你却在履行 为他操纵他的财产


谢谢您的时间,我希望我在某些方面对您有所帮助:D.

好的,但是受保护的可见性在这种情况下不会有帮助,因为我没有在继承上下文中调用该方法。这样想:Header使用列表,而不是Header是列表。通过扩展列表,我的Headers类将 来吧。