为什么PHP允许从其他实例调用私有方法?

时间:2013-05-13 10:14:33

标签: php oop encapsulation

只要它们来自同一个类的实例,PHP就会调用私有方法。

the PHP docs解释了这一点:

  

相同类型的对象可以访问彼此私有和受保护的成员,即使它们不是同一个实例。这是因为在这些对象内部已经知道实现特定的细节。

这不会破坏封装吗? implementation specific details are known如何证明这一点的事实是什么?

P.S。还有其他(面向对象的)语言吗?

3 个答案:

答案 0 :(得分:1)

对于大多数语言都是如此,java你也可以这样做, 这是因为对象来自同一个实例,它“知道”相同实例具有的所有属性

答案 1 :(得分:1)

作为对 post scriptum 的回答,Delphi(所谓的“object pascal”)和Lazarus(“free pascal”)都允许仅在与其相同的单元中访问私有属性。类实现是编码的。因此,您可以在一个单元中插入两个不同的类,并且可以访问彼此的私有属性。

如果两个类放在不同的单元中是不允许的(假设它类似于PHP中的命名空间)。

答案 2 :(得分:1)

作为答案“这不会破坏封装吗?”:

虽然Encapsulation principle in OOP定义有点含糊不清。我理解它的方式是它将私有数据和逻辑保存在类的边界内。

  

封装用于隐藏类中结构化数据对象的值或状态,防止未授权方直接访问它们。

我不知道PHP,Java和其他语言中这种类的行为是好还是坏,但我认为它不会破坏类的封装