PHP方法重载遇到的一个问题

昨天同事反馈我开发的页面突然500了,没有任何错误提示。

我开始排查代码,发现是控制器中的定义了一个protected方法报错了。

// 子类的代码
class User extends Person
{
    protected function jsonOut($array)
    {
        echo json_encode($array);
    }
}

本来这也没什么问题,后来其他同事在控制器父类中增加了一个同名的方法,而且把访问控制设置为public,这样一来我的方法就报错了。

提示:

PHP Fatal error:  Access level to User::jsonOut() must be public (as in class Person) in

原来PHP中有这样一个限制,子类重写父类方法时,是不能把一个public方法改为protected或者private的。更准确的说,子类重写父类方法时,不能改变父类方法的访问控制。

// 父类的代码
class Person
{
    public function jsonOut($array)
    {
        echo json_encode($array;
    }
}

正常的开发中,也不会有什么问题,但如果是子类中先有某个方法,父类中增加方法时恰好和子类方法重名了,就很难发现这个问题。

造成的结果就是,我在父类中加了一个方法,没想到却把别人的子类给搞挂了。

如何避免这个问题呢?

我想到的是,我们在父类中新增一个方法时,最好在子类中全局搜索一下,看看有没有重名的方法并做相应的适配。

这个问题正好也体现了脚本语言的缺点,改完代码无法发现对全局代码的影响,如果是Java或者其他编译型语言,可能在在编译阶段就会发现这样的问题。我们享受着脚本语言的轻量和便利,也要承受更多的风险~~

 

 

转载于:https://my.oschina.net/crazymus/blog/3049443

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值