PHP 如何重写方法

不少人在学PHP的时候,会碰到“父子类同名方法”的情况,不知道怎么用才能避免出错,还能实现更灵活的功能。其实这就是PHP里的方法重写,核心是子类可以修改父类的同名方法,还能保留父类的核心逻辑,比重新写一遍要省心很多。

先搞懂:什么时候需要方法重写?

举个生活化的例子,你家里有个老电饭煲(这就相当于PHP里的父类),它的“煮饭”逻辑是:放米、加水、按开关。但现在你想做低糖饭,需要在原来的基础上,多加“浸泡10分钟”的步骤——这时候就不用重新买个新电饭煲,只需要在原来的基础上调整煮饭逻辑,这就对应了“子类重写父类方法”。

PHP 如何重写方法

在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的方法重写就是这么简单,核心就是“继承父类的同名方法,按需调整”,用生活化的例子和简单的代码,就能快速掌握,不用怕晦涩的术语。

上一篇 JavaScript 如何校验手机号