php面向对象全攻略 (八)重载新的方法


Posted in PHP onSeptember 30, 2009

12.重载新的方法
在学习PHP 这种语言中你会发现,PHP 中的方法是不能重载的,所谓的方法重载就是
定义相同的方法名,通过“参数的个数”不同或“参数的类型”不同,来访问我们的相同方法
名的不同方法。但是因为PHP 是弱类型的语言,所以在方法的参数中本身就可以接收不同类
型的数据,又因为PHP 的方法可以接收不定个数的参数,所以通过传递不同个数的参数调用
不相同方法名的不同方法也是不成立的。所以在PHP 里面没有方法重载。不能重载也就是在
你的项目中不能定义相同方法名的方法。另外,因为PHP 没有名子空间的概念,在同一个页
面和被包含的页面中不能定义相同名称的方法,也不能定义和PHP 给我提供的方法重名,当
然在同一个类中也不能定义相同名称的方法。
我们这里所指的重载新的方法所指的是什么呢?其实我们所说的重载新的方法就是子类
覆盖父类的已有的方法,那为什么要这么做呢?父类的方法不是可以继承过来直接用吗?但
有一些情况是我们必须要覆盖的,比如说我们前面提到过的例子里面,“Person”这个人类里
面有一个“说话”的方法,所有继承“Person”类的子类都是可以“说话”的,我们“Student”
类就是“Person”类的子类,所以“Student”的实例就可以“说话”了,但是人类里面“说
话”的方法里面说出的是“Person”类里面的属性,而“Student”类对“Person”类进行了扩
展,又扩展出了几个新的属性,如果使用继承过来的“say()”说话方法的话,只能说出从
“Person”类继承过来的那些属性,那么新扩展的那些属性使用这个继承过来的“say()”的
方法就说不出来了,那有的人就问了,我在“Student”这个子类中再定义一个新的方法用于
说话,说出子类里面所有的属性不就行了吗?一定不要这么做,从抽象的角度来讲,一个“学
生”不能有两种“说话”的方法,就算你定义了两个不同的说话的方法,可以实现你想要的
功能,被继承过来的那个“说话“方法可能没有机会用到了,而且是继承过来的你也删不掉。
这个时候我们就要用到覆盖了。
虽然说在PHP 里面不能定义同名的方法,但是在父子关系的两个类中,我们可以在子类
中定义和父类同名的方法,这样就把父类中继承过来的方法覆盖掉了。
代码片段

<? 
//定义一个“人”类做为父类 
class Person{ 
//下面是人的成员属性 
var $name; //人的名子 
var $sex; //人的性别 
var $age; //人的年龄 
//定义一个构造方法参数为属性姓名$name、性别$sex和年龄$age进行赋值 
function __construct($name, $sex, $age){ 
$this->name=$name; 
$this->sex=$sex; 
$this->age=$age; 
} 
//这个人可以说话的方法, 说出自己的属性 
function say() { 
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."<br>"; 
} 
} 
class Student extends Person 
{ 
var $school; //学生所在学校的属性 
//这个学生学习的方法 
function study() { 
echo "我的名子叫:".$this->name." 我正在”.$this->school.”学习<br>"; 
} 
//这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法 
function say() { 
echo "我的名子叫:".$this->name." 性别:".$this->sex." 我的年龄是:".$this->age."我在 
".$this->school."上学.<br>"; 
} 
} 
?>

上面的例子,我们就在“Student”子类里覆盖了继承父类里面的“say()”的方法,通过
覆盖我们就实现了对“方法”扩展。
但是,像这样做虽然解决了我们上面说的问题,但是在实际开发中,一个方法不可能就
一条代码或是几条代码,比如说“Person”类里面的“say()”方法有里面有100 条代码,如
果我们想对这个方法覆盖保留原有的功能外加上一点点功能,就要把原有的100 条代码重写
一次,再加上扩展的几条代码,这还算是好的,而有的情况,父类中的方法是看不见原代码
的,这个时候你怎么去重写原有的代码呢?我们也有解决的办法,就是在子类这个方法中可
以调用到父类中被覆盖的方法,也就是把被覆盖的方法原有的功能拿过来再加上自己的一点
功能,可以通过两种方法实现在子类的方法中调用父类被覆盖的方法:
一种是使用父类的“类名::“来调用父类中被覆盖的方法;
一种是使用“parent::”的方试来调用父类中被覆盖的方法;
代码片段
class Student extends Person{ 
var $school; //学生所在学校的属性 
//这个学生学习的方法 
function study() { 
echo "我的名子叫:".$this->name." 我正在”.$this->school.”学习<br>"; 
} 
//这个学性可以说话的方法, 说出自己所有的属性,覆盖了父类的同名方法 
function say() { 
//使用父类的“类名::“来调用父类中被覆盖的方法; 
// Person::say(); 
//或者使用“parent::”的方试来调用父类中被覆盖的方法; 
parent::say(); 
//加上一点自己的功能 
echo “我的年龄是:".$this->age."我在".$this->school."上学.<br>"; 
} 
}

现在用两种方式都可以访问到父类中被覆盖的方法,我们选那种方式最好呢?用户可能
会发现自己写的代码访问了父类的变量和函数。如果子类非常精炼或者父类非常专业化的时
候尤其是这样。不要用代码中父类文字上的名字,应该用特殊的名字parent,它指的就是子
类在extends 声明中所指的父类的名字。这样做可以避免在多个地方使用父类的名字。如果继
承树在实现的过程中要修改,只要简单地修改类中extends 声明的部分。
同样,构造方法在子类中如果没有声明的话,也可以使用父类中的构造方法,如果子类
中重新定义了一个构造方法也会覆盖掉父类中的构造方法,如果想使用新的构造方法为所有
属性赋值也可以用同样的方式。
代码片段
class Student extends Person{ 
var $school; //学生所在学校的属性 
function __construct($name, $sex, $age, $school){ 
//使用父类中的方法为原有的属性赋值 
parent::__construct($name, $sex, $age); 
$this->school=$school; 
} 
//这个学生学习的方法 
function study() { 
echo "我的名子叫:".$this->name." 我正在”.$this->school.”学习<br>"; 
} 
//这个人可以说话的方法, 说出自己的属性 
function say() { 
parent::say(); 
//加上一点自己的功能 
echo “我的年龄是:".$this->age."我在".$this->school."上学.<br>";
PHP 相关文章推荐
投票管理程序
Oct 09 PHP
PHP session有效期问题
Apr 26 PHP
php读取html并截取字符串的简单代码
Nov 30 PHP
用PHP为SHOPEX增加日志功能代码
Jul 02 PHP
php程序效率优化的一些策略小结
Jul 17 PHP
FireFox浏览器使用Javascript上传大文件
Oct 30 PHP
PHP Mysqli 常用代码集合
Nov 12 PHP
php微信公众平台交互与接口详解
Nov 28 PHP
PHP文件与目录操作示例
Dec 24 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
Feb 08 PHP
利用PHP扩展Xhprof分析项目性能实践教程
Sep 05 PHP
PHP钩子实现方法解析
May 21 PHP
php面向对象全攻略 (七) 继承性
Sep 30 #PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
Sep 30 #PHP
php面向对象全攻略 (五) 封装性
Sep 30 #PHP
php面向对象全攻略 (四)构造方法与析构方法
Sep 30 #PHP
php面向对象全攻略 (三)特殊的引用“$this”的使用
Sep 30 #PHP
php面向对象全攻略 (二) 实例化对象 使用对象成员
Sep 30 #PHP
php面向对象全攻略 (一) 面向对象基础知识
Sep 30 #PHP
You might like
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
php实现文件下载代码分享
2014/08/19 PHP
用Javascript做flash做的事..才完成的一个类.Auntion Action var 0.1
2007/02/23 Javascript
Extjs中DisplayField的日期或者数字格式化扩展
2010/09/03 Javascript
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
2015/08/19 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
vue实现微信获取用户信息的方法
2019/03/21 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
微信小程序 接入腾讯地图的两种写法
2021/01/12 Javascript
Python入门之modf()方法的使用
2015/05/15 Python
Python中format()格式输出全解
2019/04/12 Python
python调用其他文件函数或类的示例
2019/07/16 Python
python的常见矩阵运算(小结)
2019/08/07 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
2020/02/26 Python
Django日志及中间件模块应用案例
2020/09/10 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
基于Python实现天天酷跑功能
2021/01/06 Python
Python开发.exe小工具的详细步骤
2021/01/27 Python
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
学校办公室主任职责
2013/12/27 职场文书
继承公证书样本
2014/04/04 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
人生哲理妙语30条:淡写流年,笑过人生
2019/09/04 职场文书
导游词之日月潭
2019/11/05 职场文书