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 IP及IP段进行访问限制的代码
Dec 17 PHP
PHP 类相关函数的使用详解
May 10 PHP
php中simplexml_load_string使用实例分享
Feb 13 PHP
php对数组排序代码分享
Feb 24 PHP
ThinkPHP采用实现三级循环代码实例
Jul 18 PHP
PHP列出MySQL中所有数据库的方法
Mar 12 PHP
php使用Jpgraph绘制3D饼状图的方法
Jun 10 PHP
PHP实现获取中英文首字母
Jun 19 PHP
PHP的命令行命令使用指南
Aug 18 PHP
PHP redis实现超迷你全文检索
Mar 04 PHP
PHP简单实现循环链表功能示例
Nov 10 PHP
laravel框架创建授权策略实例分析
Nov 22 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开发需要注意的安全问题
2010/09/01 PHP
php设计模式 Prototype (原型模式)代码
2011/06/26 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
PHP实现多关键字加亮功能
2016/10/21 PHP
eval与window.eval的差别分析
2011/03/17 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
js中innerText/textContent和innerHTML与target和currentTarget的区别
2019/01/21 Javascript
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
Vue实现简单计算器案例
2020/02/25 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
Python3.6简单操作Mysql数据库
2017/09/12 Python
Python3计算三角形的面积代码
2017/12/18 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
Python SQL查询并生成json文件操作示例
2018/08/17 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
2019/07/22 Python
wxpython绘制音频效果
2019/11/18 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
python定时截屏实现
2020/11/02 Python
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
飞利浦法国官网:Philips法国
2019/07/10 全球购物
关于廉洁的广播稿
2014/01/30 职场文书
教师个人鉴定材料
2014/02/08 职场文书
三八节主持词
2014/03/17 职场文书
公司授权委托书格式范文
2014/10/02 职场文书
学生会感恩节活动方案
2014/10/11 职场文书
践行党的群众路线心得体会
2014/11/05 职场文书
运动会广播稿300字
2015/08/19 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android