PHP面向对象程序设计(OOP)之方法重写(override)操作示例


Posted in PHP onDecember 21, 2018

本文实例讲述了PHP面向对象程序设计(OOP)之方法重写(override)操作。分享给大家供大家参考,具体如下:

因为PHP是弱类型的语言, 所以在方法的参数中本身就可以接收不同类型的数据,又因为PHP的方法可以接收不定个数的参数,所以通过传递不同个数的参数调用不相同方法名的不同方法也是不成立的,所以php是不能重载的。

虽然说在PHP里面不能定义同名的方法, 但是在父子关系的两个类中,我们可以在子类中定义和父类同名的方法,这样就把父类中继承过来的方法覆盖掉了(重写父类方法)。

<?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 "my name is:" . $this->name . " sex:" . $this->sex . " my age is:" . $this->age;
}
}
//定义一个子类“学生类“使用”extends”关键字来继承”人”类:
class Student extends Person
{
var $school; //学生所在学校的属性
function __construct($name,$sex,$age,$school)
{
parent::__construct($name,$sex,$age);
$this->school = $school;
}
// 重写父类的say()方法
function say()
{
echo "my name is:" . $this->name ." my school is:" . $this->school;
}
//这个学生学习的方法
function study()
{
echo "my name is:" . $this->name . " my school is:" . $this->school;
}
}
?>

另外在子类覆盖父类的方法时也要注意一点,子类中方法的访问权限一定不能低于父类被覆盖方法的访问权限,也就是一定要高于或等于父类方法的访问权限。

例如,如果父类方法的访问权限是protected,那么子类中要覆盖的权限就要是protectedpublic,如果父类的方法是public那么子类中要覆盖的方法只能也是public,总之子类中的方法总是要高于或等于父类被覆盖方法的访问权限。

上面的例子, 我们就在“Student”子类里覆盖了继承父类里面的”say()”的方法,通过覆盖我们就实现了对“方法”扩展。但是,像这样 做虽然解决了我们上面说的问题,但是在实际开发中,一个方法不可能就一条代码或是几条代码,比如说“Person”类里面的“say()”方法有里面有 100条代码,如果我们想对这个方法覆盖保留原有的功能外加上一点点功能,就要把原有的100条代码重写一次, 再加上扩展的几条代码,这还算是好的,而有的情况,父类中的方法是看不见原代码的,这个时候你怎么去重写原有的代码呢?我们也有解决的办法,就是在子类这 个方法中可以调用到父类中被覆盖的方法, 也就是把被覆盖的方法原有的功能拿过来再加上自己的一点功能,可以通过两种方法实现在子类的方法中调用父类被覆盖的方法:

  • 一种是使用父类的“类名::“来调用父类中被覆盖的方法;
  • 一种是使用“parent::”的方试来调用父类中被覆盖的方法;
//定义一个子类“学生类“使用”extends”关键字来继承”人”类:
class Student extends Person
{
var $school; //学生所在学校的属性
function __construct($name,$sex,$age,$school)
{
parent::__construct($name,$sex,$age);
$this->school = $school;
}
// 重写父类的say()方法
function say()
{
//使用父类的"类名::"来调用父类中被覆盖的方法;
// Person::say();
//或者使用"parent::"的方试来调用父类中被覆盖的方法;
parent::say();
echo "my name is:" . $this->name ." my school is:" . $this->school;
}
//这个学生学习的方法
function study()
{
echo "my name is:" . $this->name . " my school is:" . $this->school;
}
}

现在用两种方式都可以访问到父类中被覆盖的方法,我们选那种方式最好呢?用户可能会发现自己写的代码访问了父类的变量和函数。如果子类非常精炼或者父类非 常专业化的时候尤其是这样。 不要用代码中父类文字上的名字,应该用特殊的名字 parent,它指的就是子类在 extends 声明中所指的父类的名字。这样做可以避免在多个地方使用父类的名字。如果继承树在实现的过程中要修改,只要简单地修改类中 extends 声明的部分。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP面向对象的使用教程 简单数据库连接
Nov 25 PHP
php UTF-8、Unicode和BOM问题
May 18 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
Jan 11 PHP
使用Sphinx对索引进行搜索
Jun 25 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
Feb 18 PHP
php GUID生成函数和类
Mar 10 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
Sep 23 PHP
基于thinkPHP框架实现留言板的方法
Oct 17 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
May 04 PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 PHP
PHP convert_uudecode()函数讲解
Feb 14 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 25 PHP
PHP支付宝当面付2.0代码
Dec 21 #PHP
php json转换相关知识(小结)
Dec 21 #PHP
PHP后期静态绑定实例浅析
Dec 21 #PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 #PHP
PHP类与对象后期静态绑定操作实例详解
Dec 20 #PHP
PHP设计模式之模板方法模式实例浅析
Dec 20 #PHP
PHP设计模式之模板模式定义与用法详解
Dec 20 #PHP
You might like
php遍历目录输出目录及其下的所有文件示例
2014/01/27 PHP
php对包含html标签的字符串进行截取的函数分享
2014/06/19 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
jquery实现智能感知连接外网搜索
2013/05/21 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
使用jQuery jqPlot插件绘制柱状图
2014/12/18 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
JavaScript使用DeviceOne开发实战(四)仿优酷视频应用
2015/12/02 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
angular6.0开发教程之如何安装angular6.0框架
2018/06/29 Javascript
vue-自定义组件传值的实例讲解
2018/09/18 Javascript
使用koa-log4管理nodeJs日志笔记的使用方法
2018/11/30 NodeJs
原生js实现公告滚动效果
2021/01/10 Javascript
微信二次分享报错invalid signature问题及解决方法
2019/04/01 Javascript
jquery实现手风琴案例
2020/05/04 jQuery
Python调用C语言开发的共享库方法实例
2015/03/18 Python
python清除指定目录内所有文件中script的方法
2015/06/30 Python
python入门教程之识别验证码
2017/03/04 Python
python 系统调用的实例详解
2017/07/11 Python
Python决策树分类算法学习
2017/12/22 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
对Python3 goto 语句的使用方法详解
2019/02/16 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
pandas数据处理之绘图的实现
2020/06/15 Python
python日志通过不同的等级打印不同的颜色(示例代码)
2021/01/13 Python
h5实现获取用户地理定位的实例代码
2017/07/17 HTML / CSS
酒店秘书求职信范文
2014/02/17 职场文书
开票员岗位职责
2015/02/12 职场文书
css 边框添加四个角的实现代码
2021/10/16 HTML / CSS
在Docker容器中部署SQL Server
2022/04/11 Servers