<?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方法做一个访问器,保证既把访问权间接开放给子类,又能在子类访问时执行一些必要的控制逻辑。