在PHP中,函数是不能重名的,同一个类中方法也不能重名,我们这里所说的重载,是指子类方法与父类方法以同名的方式对父类方法进行覆盖。很多时候,子类可以继承父类的方法直接拿过来用,但是有一些时候,子类需要覆盖父类原有的方法,为自己扩展一些新功能。我们通过代码来分析,同样要注意看注释部分哦:
class Role //角色类
{
//属性部分
public $role_name; //名字
//方法部分
public function roleTalk() //说话
{
echo '我的名字叫:'.$this->role_name.'<br />';
}
}
class RoleSon extends Role //角色儿子类 继承 角色类
{
//属性部分
public $role_nickname; //小名(新的属性)
//方法部分
public function roleTalk() //说话(重载覆盖)
{
echo '我的名字叫:'.$this->role_name.'<br />';
echo '我的小名叫:'.$this->role_nickname.'<br />';
}
}
//实例化角色类
$brother_chun = new Role();
$brother_chun->role_name = '春哥'; //名字
$brother_chun->roleTalk(); //父类原有方法
//实例化角色儿子类
$brother_chun_son = new RoleSon();
$brother_chun_son->role_name = '春哥之子'; //名字
$brother_chun_son->role_nickname = '狗胜'; //小名(儿子特有)
$brother_chun_son->roleTalk(); //子类覆盖方法
以上代码将输出:
我的名字叫:春哥
我的名字叫:春哥之子
我的小名叫:狗胜
通过上面的代码我们可以看到,子类里有一个新的属性$role_nickname,这个子类里的属性是无法被父类的roleTalk()方法访问的,如果子类通过继承直接使用roleTalk()方法话,那么新的属性就会毫无用处了,因此我们可以通过在子类里建立一个与父类同名的方法来重载,即覆盖父类原有的方法来达到我们的目的——让春哥之子说出自己的小名。
那么有人可能就要问了,我们在子类重新定义一个说话的新方法,比如newRoleTalk()不就得了?效果还不是一样。但是我必须告诉大家,最好不要这么做,因为这不符合现实的逻辑,就好像一个人只有一个嘴巴,我们不可能为了让人多说一句话就多长一个嘴巴,设想如果春哥真长出了N个嘴巴,我们就不用等到2012世界末日了对不对?
那么又有人要问了,roleTalk()原有方法里面只有一行代码,我们要利用重载来扩展一些新功能十分容易搞定,如果roleTalk()里面有成百上千行代码的话,而且父类代码是封装的我们无法查看,那事情不就大条了?的确是这样的,但是不要着急,PHP为我们提供了完美的解决方案来调用父类方法的原有代码,只需要在重载时添加新的代码即可,方法如下:
方法一(建议使用)
parent::方法的名称();
方法二(不建议使用)
父类的名称::方法的名称();
完整代码如下:
class Role //角色类
{
//属性部分
public $role_name; //名字
//方法部分
public function roleTalk() //说话
{
echo '我的名字叫:'.$this->role_name.'<br />';
}
}
class RoleSon extends Role //角色儿子类 继承 角色类
{
//属性部分
public $role_nickname; //小名(新的属性)
//方法部分
public function roleTalk() //说话(重载)
{
parent::roleTalk(); //父类方法原有的代码
echo '我的小名叫:'.$this->role_nickname.'<br />'; //子类方法新增的代码
}
}
//实例化角色类
$brother_chun = new Role();
$brother_chun->role_name = '春哥'; //名字
$brother_chun->roleTalk(); //父类原有方法
//实例化角色儿子类
$brother_chun_son = new RoleSon();
$brother_chun_son->role_name = '春哥之子'; //名字
$brother_chun_son->role_nickname = '狗胜'; //小名(儿子特有)
$brother_chun_son->roleTalk(); //子类覆盖方法
以上代码依然将输出:
我的名字叫:春哥
我的名字叫:春哥之子
我的小名叫:狗胜
这样一来,我们就可以轻松的利用重载为原有方法扩展新功能了。OK,那么今天就玩到这里,再次感谢大家的支持,我会抽时间尽力尽快更新的。
作者:hetty 首发地址:http://www.im286.com/thread-4823948-1-1.html





最近评论