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

 更新时间:2018年12月21日 11:25:16   作者:天涯海角路  
这篇文章主要介绍了PHP面向对象程序设计(OOP)之方法重写(override)操作,简单描述了php面向对象程序设计中方法重写的原理,并结合实例形式分析了php方法重写相关实现技巧与注意事项,需要的朋友可以参考下

本文实例讲述了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数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

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

相关文章

  • PHP 抽象方法与抽象类abstract关键字介绍及应用

    PHP 抽象方法与抽象类abstract关键字介绍及应用

    抽象方法指没有方法体的方法,只要一个类里面有一个方法是抽象方法,那么这个类就要定义为抽象类,不了解的朋友可以看看
    2014-10-10
  • PHP解压tar.gz格式文件的方法

    PHP解压tar.gz格式文件的方法

    这篇文章主要介绍了PHP解压tar.gz格式文件的方法,较为详细的介绍了PHP安装pear扩展及解压tar.gz格式文件的具体实现技巧,需要的朋友可以参考下
    2016-02-02
  • php使用pthreads v3多线程实现抓取新浪新闻信息操作示例

    php使用pthreads v3多线程实现抓取新浪新闻信息操作示例

    这篇文章主要介绍了php使用pthreads v3多线程实现抓取新浪新闻信息操作,结合实例形式分析了php使用pthreads多线程抓取新浪新闻信息具体实现步骤与操作技巧,需要的朋友可以参考下
    2020-02-02
  • PHP读取XML值的代码(推荐)

    PHP读取XML值的代码(推荐)

    PHP读取XML值的代码,网上很多是pdf版的,变向的赚积分,脚本特为大家搜索整理。希望大家以后多多的支持我们。
    2011-01-01
  • PHPUnit PHP测试框架安装方法

    PHPUnit PHP测试框架安装方法

    PHPUnit是一个轻量级的PHP测试框架。它是在PHP5下面对JUnit3系列版本的完整移植,是xUnit测试框架家族的一员(它们都基于模式先锋Kent Beck的设计)。
    2011-03-03
  • PHP 编写大型网站问题集

    PHP 编写大型网站问题集

    是否容易维护、是否足够健壮、否效率足够高、是否足够安全,当PHP用于建立大型网站时这些就成为很关键的因素。
    2010-05-05
  • PHP实现RabbitMQ消息列队的示例代码

    PHP实现RabbitMQ消息列队的示例代码

    众所周知,php本身的运行效率存在一定的缺陷,所以如果有一个很复杂很耗时的业务时,必须开发一个常驻内存的程序。本文将利用PHP实现RabbitMQ消息列队,感兴趣的可以了解一下
    2022-05-05
  • 详解WordPress中的头像缓存和代理中的缓存更新方法

    详解WordPress中的头像缓存和代理中的缓存更新方法

    这篇文章主要介绍了WordPress中的头像缓存和代理中的缓存更新方法,分别针对Gravatar头像的本地缓存以及代理中的css/js文件缓存更新,需要的朋友可以参考下
    2016-03-03
  • php源码分析之DZX1.5加密解密函数authcode用法

    php源码分析之DZX1.5加密解密函数authcode用法

    这篇文章主要介绍了php源码分析之DZX1.5加密解密函数authcode用法,实例分析了DZX1.5中authcode函数加密与解密的使用技巧,需要的朋友可以参考下
    2015-06-06
  • 你应该知道的PHP+MySQL分页那点事

    你应该知道的PHP+MySQL分页那点事

    你应该知道的PHP+MySQL分页那点事,这篇文章主要为大家详细介绍了PHP+MySQL分页技术,为大家提供了完整php分页实例,感兴趣的小伙伴们可以参考一下
    2016-08-08

最新评论