PHP继承有关private成员的探究

<?php
header("content-type:text/html;charset=utf-8;");
class Person
{
    private $name;
    private $age;

    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }
}

class Student extends Person
{
}

$object = new Student('liang',23);
var_dump($object);

输出:

object(Student)#1 (2) {
  ["name":"Person":private]=>
  string(5) "liang"
  ["age":"Person":private]=>
  int(23)
}

//上面的类的设计不符合OOP的规范
解析:必须明确:private, public和protected这几个关键字,和继承没半点关系。人家叫做“可见性(Visibility)”。
从“拥有”这个角度来说,子类是基类的套壳,基类的一切当然都在子类中“存在”————只是从子类的角度能不能“看得到”而已。

如下图(蓝色箭头部分),private member肯定存在在子类的存储空间中,也就是说肯定被子类继承到了。但子类新增的方法就是访问不到。
继承有关的访问控制
这个事情从架构设计这个意义上,其实是很容易说清楚的。一个子类必须遵守基类的所有特征,然后在其上做出增补和扩充。而如果基类的所有成员都开放给子类随便看、随便改,基类的本来特征可以随便拆掉,那么还要继承做什么呢?

在实际工程中,基类的私有成员,要么是基类自己内部使用,要么是像上图(红色箭头部分)一样,通过protected方法做一个访问器,保证既把访问权间接开放给子类,又能在子类访问时执行一些必要的控制逻辑。


参考链接:https://segmentfault.com/q/1010000002945464

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值