php--有限继承
思考:类中有三大类成员:属性,方法和类常量,还有访问修饰限定符限制,那么继承是子类可以使用父类所有成员吗?
引入:从理论上讲,继承后子类是可以访问父类的所有成员的,但实际上父类有一些成员并不希望被子列访问的,所以继承是有限的
有限继承【掌握】
定义 :有限继承,指子类在继承父类的成员的时候,并非继承所有内容,而是继承并使用父类的部分内容
1.继承内容:php中继承是子类继承父类所有的公有成员,受保护成员和私有属性,不能继承父类的私有方法
<?php class posen{ protected $age=30; public $sex="女"; private $count=100; public function show(){ echo $this->count; } private function inbox(){ echo '我是不能被继承的'; } } class man extends posen{ public function add(){ echo $this->age; //其中age 也是继承了posen的属性 } } $s=new man(); $s->show(); //输出100 $s->add(); //输出30 $s->inbox(); //语法直接就报错了 ?>
注意:虽然子类可以通过以上方式来实现访问父类的私有成员(包含私有方法),但是从设计的意义上讲,私有就是不允许外部访问,所以父类通常不会提供对外访问接口,以上案例只是
为了知识说明。
4.静态成员(类常量)也遵循继承规则(php继承本质是对象),只是访问方式由类进行访问
<?php class posen{ protected static $age=30; public static $sex="女"; private static $count=100; public static function show(){ echo self::$count; } private static function inbox(){ echo '我是不能被继承的'; } } class man extends posen{ } echo man::$sex; //用man继承了posen下的静态属性,调用也是用man man::show(); ?>
5.构造方法和析构方法也可以被子类继承,此时需要注意子类对象实例化时,对应的父类构造方法的参数
<?php class posen{ private $count; public function __construct($s){ $this->count=$s; } public function __destruct(){ echo 'die'; } } class man extends posen{ } //$s=new man(); //子类实例化,自身是空类,没有指定构造函数 报错 //因为继承父类的构造函数是有参数的,所以以上方法是错误的 $s=new man(100); //正确的调用 ?>
总结:
继承是有限继承,理论上是用来继承父类允许被继承的部分,即使用public或者protected修饰的成员
因为对象的属性是保存在对象内存空间,所以父类的私有属性也会被继承
父类私有成员本质不允许被子类访问,但是可以通过父类开放接口实现(一般不会这么做)
静态成员也可以遵循继承规则
构造方法也可以被继承,因此在实例化子类对象的时候,要考虑到父类构造方法所使用到的参数问题