如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重载。

当对父类的方法进行重写时,子类中的方法必须和父类中对应的方法具有相同的方法名称,在PHP5中不限制输入参数类型、参数数量和返回值类型。(这点和Java不同)。

子类中的覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。

声明方法时,如果不定义访问权限。默认权限为public。

PHP5重写方法

先设置一个父类,这个父类是 “Dog”类,这个类描述了dog的特性。

Dog有2个眼睛,会跑,会叫。就这样描述先。

我养了一直狗,是只小狗,符合Dog类的特性,但有所不同。

我的小狗有名字,我的小狗太小了,不会大声的叫,只会哼哼。

我们用继承的概念去实现这个设计。

// 狗有两只眼睛,会汪汪叫,会跑.

class Dog {

protected $eyeNumber =2; //属性

//返回封装属性的方法.

public function getEyeNumber(){

return $this->eyeNumber;

}

//狗会叫

public function yaff(){

return "Dog yaff, wang ..wang ..";

}

//狗会跑

public function run(){

return "Dog run..running ...";

}

}

$dog = new Dog();

echo "dog have ".$dog->getEyeNumber()." eyes.
";

echo $dog->yaff() ."
".$dog->run();

echo "
";

//这是我的小狗叫"狗狗",它很小.不会汪汪叫,只会哼哼哼..

class MyDog extends Dog {

private $name = "狗狗";

public function getName(){

return $this->name;

}

public function yaff(){

return $this->name." yaff, heng...heng ..";

}

}

$myDog = new MyDog();

echo $myDog->getName()." have ".$myDog->getEyeNumber()." eyes.
";

echo $myDog->yaff() ."
".$myDog->run();

?>

程序运行结果:

dog have 2 eyes.

Dog yaff, wang ..wang ..

Dog run..running ...

狗狗 have 2 eyes.

狗狗 yaff, heng...heng ..

Dog run..running ...

重写方法与访问权限

子类中的覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。

父类为public 子类为 private时。

// 简化dog类和mydog类,演示重写的访问权限.

class Dog {

protected $eyeNumber =2; //属性

//返回封装属性的方法.

public function getEyeNumber(){

return $this->eyeNumber;

}

}

class MyDog extends Dog {

protected function getEyeNumber(){

return $this->eyeNumber;

}

}

/*

class MyDog extends Dog {

private function getEyeNumber(){

return $this->eyeNumber;

}

}

*/

?>

程序运行结果:

Fatal error: Access level to MyDog::getEyeNumber() must be public (as in class Dog) in E:\PHPProjects\test.php on line 15

父类为public 子类为 protected时。

// 简化dog类和mydog类,演示重写的访问权限.

class Dog {

protected $eyeNumber =2; //属性

//返回封装属性的方法.

public function getEyeNumber(){

return $this->eyeNumber;

}

}

class MyDog extends Dog {

private function getEyeNumber(){

return $this->eyeNumber;

}

}

?>

程序运行结果:

Fatal error: Access level to MyDog::getEyeNumber() must be public (as in class Dog) in E:\PHPProjects\test.php on line 15

重写时的参数数量

子类可以拥有与父类不同的参数数量。(这点与java不同,PHP是弱类型语言。)

// 简化dog类和mydog类,演示重写方法的参数.

class Dog {

protected $eyeNumber =2; //属性

//返回封装属性的方法.

public function getEyeNumber(){

return $this->eyeNumber;

}

}

class MyDog extends Dog {

//重写的方法与父类的方法有不同的参数数量.

public function getEyeNumber($eys){

$this->eyeNumber = $eys;

return $this->eyeNumber;

}

}

$myDog = new MyDog();

echo "my dog hava ".$myDog->getEyeNumber(3) ." eyes.";

//啸天犬..哈..

//下面这句会报一个丢失参数的错误.

//echo "my dog hava ".$myDog->getEyeNumber() ." eyes.";

?>

程序运行结果:

my dog hava 3 eyes.

构造函数重写

下面这个例子中,父类和子类都有自己的构造函数,当子类被实例化时,子类的构造函数被调用,而父类的构造函数没有被调用,请对比第一节的构造函数继承。

//2-2 / extends1.php

//构造函数继承的问题.

class Animal{

public $legNum = 0;

public function __construct(){

$this->legNum = 4;

echo "I am an animal
";

}

}

class Dog1 extends Animal {

public function __construct(){

$this->legNum = 4;

echo "I am a Dog .
";

}

}

$dog1 = new Dog1();

echo "
";

echo "legNum is ".$dog1->legNum;

/*

实例化子类时.构造函数被调用了.

*/

?>

程序运行结果:

I am a Dog .

legNum is 4

注:这点和Java不同,在java中构造函数是不能被继承的,而且子类实例化时,子类的构造函数被调用,父类的构造函数也会调用。

延伸阅读

此文章所在专题列表如下:

php方法重载方法重写_PHP面向对象之旅:方法覆盖相关推荐

  1. java中的方法重载和重写

    一.方法的重载(overload) (1)重载的概念: 在同一个类或父类与子类之间,允许存在一个以上的同名方法 (2)重载的特点: 参数列表必须不同,返回值和可见性无所谓 (3)重载示例: //返回两 ...

  2. java方法重载和重写在jvm_重载和重写在jvm运行中的区别(一)

    1.重载(overload)方法 对重载方法的调用主要看静态类型,静态类型是什么类型,就调用什么类型的参数方法. 2.重写(override)方法 对重写方法的调用主要看实际类型.实际类型如果实现了该 ...

  3. 方法重载与重写,返回类型

    重载和重写的博客已经够多了,这里我们讨论一下他们的返回类型. 重写: 首先是类的不能存在两个完全相同构造方法(同时不能以返回类型来重载方法相信大家都是知道滴) 类中的普通成员方法可以和构造方法重名(大 ...

  4. 方法重载和重写的区别,以及如何体现了多态性

    总结 (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading). 总结为 "两同一不同" 同一个类 ...

  5. Java方法重载与重写的区别

    重载(overload) 发生在同一个类中,方法名相同,参数列表不同,方法体不同 与返回值类型无关 编译期绑定 2.重写(override) 发生在父子类中,方法名称相同,参数列表相同(方法名称+参数 ...

  6. JAVA方法重载和重写的特征

    方法的重载: 方法重载是让类以统一的方式处理不同类型数据的一种手段. 多个同名函数同时存在,具有不同的参数个数/类型. 方法名相同,方法参数的个数或类型不同,通过个数和类型的不同来区分不同的函数; 方 ...

  7. java基础2:this、static、final、abstract关键字、代码块、生成API工具包、继承、多态、方法重载和重写,抽象类、接口、常见异常、java权限修饰符、选择排序思想和程序和内部类

    1.this关键字 this表示当前类对象的地址空间值的引用.就是说,this代表了new出来的对象 其最大作用就是解决了构造器中局部变量隐藏成员变量.即用this.变量名 = 变量名 区分. 2.s ...

  8. java 方法重载的作业_java第六章 方法及方法重载 课堂笔记、作业

    当参数传递为基本数据类型时,参数变化不保留,基本数据类型参数传值 当参数传递为引用数据类型时,参数变化会保留,引用数据类型参数传址 //基本数据类型在别处被重新赋值,则本体不受影响,其值不变 //引用 ...

  9. javaSE-day04--ArrayList基本用方法、类内定义方法和方法重载、静态方法static(类的方法)、工具方法(static)的定义和使用

    ArrayList基本用方法 package day04;import java.util.ArrayList;public class ArrayListDemo {public static vo ...

最新文章

  1. 程序员|那天下班回家,突然民警叫住我....
  2. Mybatis理解与入门步骤
  3. YiShaAdmin_项目的默认 XML 命名空间必须为 MSBuild XML 命名空间。如果项目是用 MSBuild 2003 格式---.Net_C#_若依.Net版Web框架使用及改造001
  4. android 控件随手指移动_Android 实习生面试经历记录
  5. TCxGrid 把列移上移下。
  6. 事务处理笔记《一》ADO.NET级别的事务
  7. 第六篇 | 解决linux环境中mysql默认端口3306无法连接问题
  8. zz 教你如何用proxyhunter找大学代理
  9. standard、singleTop、singleTask、singleInstance
  10. android 外接键盘,安卓手机外接键盘测评
  11. 银行机构的分类、特点及转型方向
  12. 灰灰考研机试班 | 基础练习二 问题 B: 日历本 | 入门题-模拟 | 日期、星期相关计算
  13. 夜晚怎么能不吃宵夜呢
  14. 例题 9-8 颜色的长度(Color Length, ACM/ICPC Daejeon 2011, UVa1625)
  15. 查询出每个雇员的姓名,工资,部门名称,工资在公司的等级及其领导的姓名,领导的工资,以及领导所对应的等级
  16. 彻底禁用停用杀死WIN10的自动更新
  17. MySQL 设置和取消“ON UPDATE CURRENT_TIMESTAMP”
  18. 复数中的运算符重载(续)
  19. 路由器ACL(访问控制列表)的类型及配置
  20. 什么是swift闭包?

热门文章

  1. hive mysql互导_利用Sqoop实现Hive的数据与MySQL数据的互导
  2. 时间复杂度和空间复杂度探究
  3. php提前终止,由于最大执行时间致命错误,PHP cron作业提前终止
  4. windowfullscreen后键盘布局顶上去_什么才是第一生产力-2.4G高斯83G双模机械键盘终入囊...
  5. matlab 非线性方程组画图,使用matlab进行非线性方程组求解
  6. mySQL危险命令_MYSQL教程Linux系统中最危险的10条命令
  7. 二本类 计算机类 大学录取分数线,重庆邮电大学什么专业实力最强?为什么二本专业都超一本线录取?...
  8. shell脚本发邮件内容html,Shell发送邮件以HTML展示
  9. mysql cluster安装配置_mysqlcluster安装与配置_MySQL
  10. php删除表格命令,数据表格-删除