昨天同事反馈我开发的页面突然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或者其他编译型语言,可能在在编译阶段就会发现这样的问题。我们享受着脚本语言的轻量和便利,也要承受更多的风险~~