重写
重写就是子类中定义父类的同名成员,子类可以重写父类的任意类成员。如果重写父类属性,则直接覆盖,父类的属性将不存在;如果重写父类方法,则该方法在子类和父类中同时存在。通常情况下,经常用来重写父类的方法,用于扩展或更改某些业务逻辑。需要注意的是,在重写方法时,首先要保证参数数量必须一致;其次,子类中的方法的访问级别应等于或弱于父类中被重写的方法访问级别。
下面通过代码演示重写的具体实现,具体代码如下。
1 class People
2 {
3 public $name = 'People';
4 public function show()
5 {
6 echo __CLASS__;
7 }
8 public function say()
9 {
10 echo __CLASS__ . 'say';
11 }
12 }
13 class Man extends People
14 {
15 public $name = 'Man';
16 public function show()
17 {
18 echo __CLASS__;
19 }
20 protected function say()
21 {
22 echo __CLASS__ . 'say';
23 }
24 }
25 $man = new Man();
26 var_dump($man); // object(Man)#1(1){["name"]=>string(3)"Man"}
27 $man->show(); // Man
28 $man->say(); // Fault error:Access level to Man::say()must...
上述代码中,魔术常量CLASS用于返回当前被调用的类名。Man类继承自People类,同时子类中含有与父类同名的属性$name和show()方法,因此在调用Man类的show()方法时,会实现方法的重写。另外,在调用Man类的say()方法时,此方法在父类People类中的访问权限修饰符是public,子类中的访问权限修饰符是protected,所以在调用时会报错。因此,Man中的say()方法必须像父类中的say()方法一样使用public修饰符。可以简单理解为,重写的方法必须跟父类的方法权限一致或比父类的权限更加开放。