PHP 如何重写方法
不少人在学PHP的时候,会碰到“父子类同名方法”的情况,不知道怎么用才能避免出错,还能实现更灵活的功能。其实这就是PHP里的方法重写,核心是子类可以修改父类的同名方法,还能保留父类的核心逻辑,比重新写一遍要省心很多。
先搞懂:什么时候需要方法重写?
举个生活化的例子,你家里有个老电饭煲(这就相当于PHP里的父类),它的“煮饭”逻辑是:放米、加水、按开关。但现在你想做低糖饭,需要在原来的基础上,多加“浸泡10分钟”的步骤——这时候就不用重新买个新电饭煲,只需要在原来的基础上调整煮饭逻辑,这就对应了“子类重写父类方法”。

在PHP里,方法重写的适用场景很明确:当子类需要父类的基础功能,又要加自己的特殊需求时,就用重写。但要注意,重写不是随便改的,得遵守几个基本规则,不然会出问题。
方法重写的3个核心规则(别踩坑)
**方法名必须完全一致**
不能搞“换汤不换药”,比如父类的煮饭方法叫cook(),子类不能写成cooking(),不然PHP会当成两个不同的方法,就不是重写了。
**参数数量尽量相同,类型要兼容**
还是拿电饭煲举例,父类煮饭只需要“米量”这一个参数,子类如果要做低糖饭,参数可以加个“是否浸泡”,但不能比父类少传参数,不然会报错。比如父类要求传米量,子类重写后却不用,调用的时候就会提示“参数不足”。
**不能降低父类方法的访问权限**
父类如果是protected(子类能访问),子类重写后不能改成private(只有当前类能访问),不然会导致其他地方调用出错。比如父类的煮饭方法是protected,子类改成private,其他地方没法调用这个方法,相当于“藏起来了”,失去了重写的意义。
用代码实例一步步学重写
我们拿刚才的电饭煲例子写个简单的代码,看完就会用了。
第一步,先写父类(老电饭煲):
`php
class OldRiceCooker {
// 父类的煮饭方法,参数是米量
protected function cook($riceAmount) {
echo "放{$riceAmount}杯米,加水,按开关煮饭<br>";
}
}
`
第二步,写子类(新电饭煲,继承父类),并重写cook()方法:
`php
class LowSugarCooker extends OldRiceCooker {
// 重写父类的cook方法,保留原逻辑,加低糖步骤
protected function cook($riceAmount) {
// 先调用父类的原逻辑,不用重复写
parent::cook($riceAmount);
// 加自己的特殊需求:浸泡步骤
echo "再加浸泡10分钟的步骤,煮出低糖饭<br>";
}
}
`
第三步,测试调用,看看效果:
`php
// 实例化子类
$myCooker = new LowSugarCooker();
// 调用重写后的方法
$myCooker->cook(2);
`
运行这段代码,输出会是:“放2杯米,加水,按开关煮饭”,接着是“再加浸泡10分钟的步骤,煮出低糖饭”——既用了父类的基础功能,又加了自己的特殊需求,完美实现重写。
重写的小技巧:保留父类逻辑
很多新手重写的时候,会完全覆盖父类的方法,比如直接在子类写新的cook方法,把父类的逻辑删掉,这样就浪费了父类的代码。其实用parent::方法名()就能保留父类的核心逻辑,只加需要的部分,这也是重写比重新写更高效的地方。
如果碰到“子类想完全改父类方法”的情况,也可以删掉parent::cook(),直接写新逻辑,比如把煮饭改成“做蛋糕”,这也是重写的一种用法,只要符合之前的规则就行。
其实PHP的方法重写就是这么简单,核心就是“继承父类的同名方法,按需调整”,用生活化的例子和简单的代码,就能快速掌握,不用怕晦涩的术语。