1.3 面向对象三大特性
- 封装
- 继承
- 多态
1.4 私有属性继承和重写
私有属性可以继承但不能重写。
<?php
class A {
private $name='PHP';
public function showA() {
//var_dump($this); //object(B)#1 (2) { ["name":"B":private]=> string(4) "Java" ["name":"A":private]=> string(3) "PHP" }
echo $this->name,'<br>'; //PHP
}
}
class B extends A {
private $name='Java';
public function showB() {
//var_dump($this); //object(B)#1 (2) { ["name":"B":private]=> string(4) "Java" ["name":"A":private]=> string(3) "PHP" }
echo $this->name,'<br>'; //Java
}
}
$obj=new B();
$obj->showA();
$obj->showB();
/*分析:
showA()和showB()中的$this都表示B的对象,B中继承了A的私有属性,所以B中有两个$name.
在showA()中只能访问A中的$name,不能访问B中的$name
在showB()中只能访问B中的$name,不能访问A中的$name
*/
练习一
<?php
class A {
protected $name='tom';
public function showA() {
echo $this->name,'<br>';
}
}
class B extends A {
public $name='berry';
public function showB() {
echo $this->name,'<br>';
}
}
//测试
$obj=new B();
$obj->showA(); //berry
$obj->showB(); //berry
/*
分析:B中将A的$name重写,所以$obj中只有一个$name,($name='berry'),不管$this在哪个方法中访问,就只能访问这个$name
*/
练习二
<?php
class A {
private $name='tom';
public function showA() {
echo $this->name,'<br>';
}
}
class B extends A {
public $name='berry';
public function showB() {
echo $this->name,'<br>';
}
}
//测试
$obj=new B();
$obj->showA(); //tom
$obj->showB(); //berry
/*
分析:
$obj中有两个$name,一个是私有的,一个是公有的
在showA()中既能访问私有的$name,也能访问公有的$name,但是私有的比公有的权限高,所以输出tom
在showB()中不能访问私有的$name,只能访问公有的$name,所以输出berry
*/