只要PHP来自同一类的实例,它就会调用私有方法。为什么PHP允许从其他实例调用私有方法?
这是怎么the PHP docs解释它:
同一类型的对象将有机会获得对方的私有和保护成员,即使他们是不一样的情况。这是因为实现特定的细节在这些对象内部时是已知的。
这不破坏封装吗? implementation specific details are known
这个事实是如何证明的呢?
p.s.是否有其他(面向对象)语言可以做到这一点?
只要PHP来自同一类的实例,它就会调用私有方法。为什么PHP允许从其他实例调用私有方法?
这是怎么the PHP docs解释它:
同一类型的对象将有机会获得对方的私有和保护成员,即使他们是不一样的情况。这是因为实现特定的细节在这些对象内部时是已知的。
这不破坏封装吗? implementation specific details are known
这个事实是如何证明的呢?
p.s.是否有其他(面向对象)语言可以做到这一点?
这是大多数语言真实的,java
你可以做到这一点, 这是因为对象是从同一个实例,它“知道”的所有属性相同的情况下,有
作为一个答案post scriptum,Delphi(所谓的“object pascal”)和Lazarus(“free pascal”)都允许只在与类实现编码相同的单元中访问私有属性。所以你可以在一个单元中插入两个不同的类,并且他们可以访问彼此的私有属性。
如果两个类放置在不同的单元中(假设它是像PHP中的命名空间那样),则不允许。
的回答为“不破此封装?”:
虽然Encapsulation principle in OOP定义有点模糊。我理解它的方式是将私有数据和逻辑保存在一个类的边界内。
封装用于隐藏类中结构化数据对象的值或状态,防止未授权方直接访问它们。
我不知道在PHP,Java等语言类的这种行为是好是坏,但我不认为它打破了封装类的。
当然。对于类成员来说,它将私有数据和逻辑保存在类的边界内。例如,成员,但情况并非如此。 – 2013-05-13 10:35:50
@EmanuilRusev http://stackoverflow.com/a/4244833/679227 – 2013-05-13 10:47:53
在我看来,它打破了oop规则,但是,这是你的问题吗? – Voitcus 2013-05-13 10:16:02