其他同类实例中受保护/私有属性的可见性

时间:2015-07-15 18:19:01

标签: php visibility

继承和可见性的基本规则如下:

  • 从类中访问私有成员是可以的。
  • 从子类访问私有成员不行。
  • 从超类访问私有成员不行。
  • 从类的实例访问受保护的成员是可以的。
  • 从子类的实例访问受保护的成员是可以的。
  • 从超类访问受保护的成员是不行的。

从同一个类的另一个实例访问这些属性的规则不太明显,尽管在the documentation:

中明确说明了这些规则
  • 从同一个类的另一个实例访问私有成员是可以的。
  • 从同一个类的另一个实例访问受保护的成员是可以的。

这是因为对象可以访问类规范。这似乎是由于语言中的一个实现的怪癖,尽管我们可以依赖。我很好奇的是继承链上下的其他对象实例的可见性规则。我的期望是:

  • 从另一个类实例访问私有成员是可以的。
  • 从子类的另一个实例访问私有成员是不正常的。
  • 从另一个超类实例访问私有成员是不行的。
  • 从另一个类实例访问受保护的成员是可以的。
  • 从子类的另一个实例访问受保护的成员是可以的。
  • 从另一个超类实例访问受保护的成员是不行的。

这是对的吗?

2 个答案:

答案 0 :(得分:3)

是的,没错。

可见性规则仅基于类,实例没有影响。因此,如果一个类可以访问同一实例中的特定成员,那么它也可以访问该类的其他实例中的该成员。

这不是一个怪癖,它是一个刻意的设计选择,类似于许多其他OO语言(我认为规则在C ++中基本相同)。一旦你允许类方法被允许知道该类或某个相关类的实现细节,它所处理的实例是否是它所调用的实例或该类的其他实例都无关紧要。 / p>

答案 1 :(得分:2)

不完全。这是正确的,规则只基于类,如果它是相同的实例或另一个实例并不重要,这基本上是你的问题。

但是,一般来说,你犯了 protected 的错误。来自文档:

  

声明受保护的成员只能在类本身和继承的父类中访问

(突出显示已添加)

因此,以下陈述错误

  1.   

    从超类访问受保护的成员是不行的。

  2.   

    从另一个超类实例访问受保护的成员是不行的。