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中使用灵巧的体系结构
Oct 09 PHP
php 强制下载文件实现代码
Oct 28 PHP
php四种基础算法代码实例
Oct 29 PHP
CI框架中zip类应用示例
Jun 17 PHP
wordpress安装过程中遇到中文乱码的处理方法
Apr 21 PHP
php动态变量定义及使用
Jun 10 PHP
thinkphp3.2点击刷新生成验证码
Feb 16 PHP
Symfony2学习笔记之系统路由详解
Mar 17 PHP
详解Yii2 rules 的验证规则
Dec 02 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
Feb 18 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
Mar 07 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
Oct 21 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数据库操作面向对象的优点
2006/10/09 PHP
用PHP伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
php实现从ftp服务器上下载文件树到本地电脑的程序
2009/02/10 PHP
php定义一个参数带有默认值的函数实例分析
2015/03/16 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
yii 2.0中表单小部件的使用方法示例
2017/05/23 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
客户端静态页面玩分页
2006/06/26 Javascript
javascript开发随笔一 preventDefault的必要
2011/11/25 Javascript
深入理解Javascript作用域与变量提升
2013/12/09 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
javascript中2个感叹号的用法实例详解
2014/09/04 Javascript
使用原生JS实现弹出层特效
2014/12/22 Javascript
让图片跳跃起来  javascript图片轮播特效
2016/02/16 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
React props和state属性的具体使用方法
2018/04/12 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
JS实现的自定义map方法示例
2019/05/17 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
在Python中使用base64模块处理字符编码的教程
2015/04/28 Python
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
Odoo中如何生成唯一不重复的序列号详解
2018/02/10 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
2018/02/13 Python
python函数式编程学习之yield表达式形式详解
2018/03/25 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
python IDLE添加行号显示教程
2020/04/25 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
团支部推优材料
2014/05/21 职场文书
英文感谢信格式
2015/01/21 职场文书
z-index不起作用
2021/03/31 HTML / CSS
仅仅使用 HTML/CSS 实现各类进度条的方式汇总
2021/11/11 HTML / CSS