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 相关文章推荐
人大复印资料处理程序_查询篇
Oct 09 PHP
Linux下ZendOptimizer的安装与配置方法
Apr 12 PHP
php与XML、XSLT、Mysql的结合运用实现代码
Nov 19 PHP
PHP 图片文件上传实现代码
Dec 29 PHP
PHP $_FILES函数详解
Mar 09 PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
Jul 31 PHP
php数组的概述及分类与声明代码演示
Feb 26 PHP
php用正则表达式匹配URL的简单方法
Nov 12 PHP
PHP获取指定日期是星期几的实现方法
Nov 30 PHP
PHP中实现中文字串截取无乱码的解决方法
May 29 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
Oct 12 PHP
PHP PDOStatement::debugDumpParams讲解
Jan 30 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
php5 pdo新改动加载注意事项
2008/09/11 PHP
在命令行下运行PHP脚本[带参数]的方法
2010/01/22 PHP
php数组函数序列之array_combine() - 数组合并函数使用说明
2011/10/29 PHP
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
一个简单安全的PHP验证码类、PHP验证码
2016/09/24 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
Laravel配合jwt使用的方法实例
2020/10/25 PHP
JSON 和 JavaScript eval使用说明
2010/06/13 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
JavaScript判断表单中多选框checkbox选中个数的方法
2015/08/17 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
JavaScript实现256色转灰度图
2017/02/22 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
Node.js 回调函数实例详解
2017/07/06 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
[37:45]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS Orenda
2014/05/22 DOTA
[37:29]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.19
2020/11/19 DOTA
[46:55]完美世界DOTA2联赛决赛 FTD vs Phoenix 第三场 11.08
2020/11/11 DOTA
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
2019/04/15 Python
python同时替换多个字符串方法示例
2019/09/17 Python
Python pip配置国内源的方法
2020/02/14 Python
PyQt5 如何让界面和逻辑分离的方法
2020/03/24 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
乐高积木玩具美国官网:LEGO Shop US
2016/09/16 全球购物
美国环保妈妈、儿童和婴儿用品购物网站:The Tot
2019/11/24 全球购物
应届毕业生求职自荐书
2014/01/03 职场文书
乡下人家教学反思
2014/02/01 职场文书
工程建设实施方案
2014/03/14 职场文书
英文演讲稿
2014/05/15 职场文书
机关作风建设整改方案
2014/10/27 职场文书
vue3中的组件间通信
2021/03/31 Vue.js