什么叫重写?
重写,其实就是子类重新定义父类继承给自己的属性或者方法。
基本特征
父类已经有的属性或方法,子类用同样的名字再定义一次。
为什么要重写?
通常,子类的特征信息的定义,都应该是比父类更为“详细”,其表现在两个方面:
1、父类没有的,子类可以有;(注意:添加特征信息是扩展,不是重写)
2、父类有的,子类也可以有,但子类会定义得“自认为”更为细致或者准确,这就是重写
如果从父类继承的成员不能满足子类的需求,可以对其进行改写,这个过程称为重写(override),也叫覆盖。
因为PHP是弱类型的语言, 所以在方法的参数中本身就可以接收不同类型的数据,又因为PHP的方法可以接收不定个数的参数,所以通过传递不同个数的参数调用不相同方法名的不同方法也是不成立的(这点和java不同)。
注意,在编程语言中,php的重载要和其他语言的重载区别开来;在php中,重写要和重载区分开来;
定义一个动物类,然后定义两个子类小鸡类和羊驼类演示一下,代码才是检验真理的唯一标准
<?php
//定义一个动物类
class animal {
public $weight = 0;
public function eating()
{
echo "动物正在吃东西";
}
}
class alpaca extends animal {
public $weight = 20; //覆盖了父类的属性
//覆盖了父类的方法
public function eating()
{
echo '羊驼正在吃东西'.PHP_EOL;
$this->weight +=5;
}
}
class chicken extends animal {
//覆盖了父类的方法
public function eating()
{
echo '小鸡在吃东西'.PHP_EOL;
$this->weight ++;
}
}
$alpaca = new alpaca();
$alpaca->eating();
$alpaca->eating();
echo '羊驼的体重是:'.$alpaca->weight.PHP_EOL;
$chicken = new chicken();
$chicken->eating();
$chicken->eating();
echo '小鸡的体重是:'.$chicken->weight.PHP_EOL;
重写的注意项
1、子类只能放大权限,不能缩小权限。
2、对于方法的重写,要求方法的形参必须和父类的形参数量一一对应(在php中,不对应不会报错,但是代码不建议你这样做)。
3、对于构造方法,没有形参要求。
4、对于父类私有的成员方法,虽然没继承(也有一说,继承过来了,但是不能访问),但是也必须保持形参数量一一对应