php继承及私有属性访问问题

class FatherClass
{
    // private $salary = 1000;
    private $salary = 1000;

    public function showInfo()
    {
        echo $this->phone . '<br/>';
        echo $this->salary . '<br/>';
    }
}

class ChildClass extends FatherClass
{
    protected $phone = '13987654321';
    private $salary = 20000;
}

$child = new ChildClass();
$child->showInfo();
echo '<pre>';
print_r($child);

输出:
13987654321
1000
ChildClass Object
(
    [phone:protected] => 13987654321
    [salary:ChildClass:private] => 20000
    [salary:FatherClass:private] => 1000
)

疑问:
child实例现在有两个私有属性,我可以理解为成员方法在哪个类中,私有属性就调用哪个类的
那么如果注释掉父类中的 private $salary = 1000; 结果就会报错:
Cannot access private property ChildClass::$salary····
不能访问 ChildClass 类的私有属性,我也可以理解,因为父类相对子类是类外,不能访问私有属性
那么 protected 的属性也在类外,怎么又能访问了呢?

如果理解为 子类继承了父类的成员方法,所以访问到了子类的 protected 属性,那为什么又不能访问子类的私有属性呢?

还是说:私有属性是区分类的(从打印结果看出),访问私有属性时,只访问本类中的私有属性,而访问public和protected的属性,则根据对象实例具体的值决定?

谢谢诸位,不知道我的描述清楚不

阅读 3.2k
4 个回答

protected能访问, 是因为protected规定继承类可以访问,外部不可以. 设定这个关键字就是为了干这个的

protected: 关键字是只有这个类和这个类的子类可以访问
private:只有类本身可以访问
public: 所有类都能访问

没有为什么,这是语言规定。

为什么又不能访问子类的私有属性呢

???如果能访问,那私有属性中的"私有"二字的意义是什么??

感谢诸位的帮助,可能我纠结的点描述的不是很清楚,我纠结的是,父类成员方法在调用私有属性的逻辑是怎样的····
现在搞明白了:
子类覆盖了父类的 public、protected 属性,而没有覆盖父类的 private 属性,因此子类的实例现在有两个同名的私有属性,而调用的成员方法又在父类中,所以使用父类的私有属性
如果父类没有,则使用子类的,但使用子类的,又没有权限(父类的成员方法相对于子类来说是类外),则提示错误
Fatal error: Uncaught Error: Cannot access private property ChildClass::$salary in ···
如果子类也没有,会提示
Notice: Undefined property: ChildClass::$salary in ····
这说明PHP内部确实先找了子类的,如果有、但发现没有权限,所以提示上面的 Fatal error

==== update ====
受保护的类成员则可以被其自身以及其子类和父类访问

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题