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 相关文章推荐
用PHP和ACCESS写聊天室(五)
Oct 09 PHP
php中的三元运算符使用说明
Jul 03 PHP
php 广告调用类代码(支持Flash调用)
Aug 11 PHP
探讨:parse url解析URL,返回其组成部分
Jun 14 PHP
php 检查电子邮件函数(自写)
Jan 16 PHP
推荐几个开源的微信开发项目
Dec 28 PHP
php实现求相对时间函数
Jun 15 PHP
php中引用符号(&amp;)的使用详细介绍
Dec 06 PHP
PHP获取当前执行php文件名的代码
Mar 02 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
Mar 15 PHP
PHP长连接实现与使用方法详解
Feb 11 PHP
php实现微信公众平台发红包功能
Jun 14 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
php下intval()和(int)转换使用与区别
2008/07/18 PHP
php代码审计比较有意思的例子
2014/05/07 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
2014/11/20 PHP
php7函数,声明,返回值等新特性介绍
2018/05/25 PHP
php写入mysql中文乱码的实例解决方法
2019/09/17 PHP
ThinkPHP5分页paginate代码实例解析
2020/11/10 PHP
filemanage功能中用到的common.js
2007/04/08 Javascript
js可突破windows弹退效果代码
2008/08/09 Javascript
js parseInt(&quot;08&quot;)未指定进位制问题
2010/06/19 Javascript
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
js操作label给label赋值及取label的值示例
2013/11/07 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
12个超实用的JQuery代码片段
2015/11/02 Javascript
理解 JavaScript Scoping &amp; Hoisting(二)
2015/11/18 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
深究AngularJS中ng-drag、ng-drop的用法
2017/06/12 Javascript
seajs中最常用的7个功能、配置示例
2017/10/10 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
nodejs简单实现TCP服务器端和客户端的聊天功能示例
2018/01/04 NodeJs
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
vue3.0实现点击切换验证码(组件)及校验
2020/11/18 Vue.js
基于vue的video播放器的实现示例
2021/02/19 Vue.js
Python解释执行原理分析
2014/08/22 Python
python图像处理之反色实现方法
2015/05/30 Python
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
浅析PHP与Python进行数据交互
2018/05/15 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
Python程序暂停的正常处理方法
2019/11/07 Python
Python常用库Numpy进行矩阵运算详解
2020/07/21 Python
Python基于pyjnius库实现访问java类
2020/07/31 Python
Python修改DBF文件指定列
2020/12/19 Python
Intimissimi德国网上商店:意大利知名内衣品牌
2018/04/03 全球购物
老干部工作先进集体事迹材料
2014/05/21 职场文书