php方法重载方法重写_PHP面向对象之旅:方法覆盖
如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(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面向对象之旅:方法覆盖相关推荐
- java中的方法重载和重写
一.方法的重载(overload) (1)重载的概念: 在同一个类或父类与子类之间,允许存在一个以上的同名方法 (2)重载的特点: 参数列表必须不同,返回值和可见性无所谓 (3)重载示例: //返回两 ...
- java方法重载和重写在jvm_重载和重写在jvm运行中的区别(一)
1.重载(overload)方法 对重载方法的调用主要看静态类型,静态类型是什么类型,就调用什么类型的参数方法. 2.重写(override)方法 对重写方法的调用主要看实际类型.实际类型如果实现了该 ...
- 方法重载与重写,返回类型
重载和重写的博客已经够多了,这里我们讨论一下他们的返回类型. 重写: 首先是类的不能存在两个完全相同构造方法(同时不能以返回类型来重载方法相信大家都是知道滴) 类中的普通成员方法可以和构造方法重名(大 ...
- 方法重载和重写的区别,以及如何体现了多态性
总结 (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading). 总结为 "两同一不同" 同一个类 ...
- Java方法重载与重写的区别
重载(overload) 发生在同一个类中,方法名相同,参数列表不同,方法体不同 与返回值类型无关 编译期绑定 2.重写(override) 发生在父子类中,方法名称相同,参数列表相同(方法名称+参数 ...
- JAVA方法重载和重写的特征
方法的重载: 方法重载是让类以统一的方式处理不同类型数据的一种手段. 多个同名函数同时存在,具有不同的参数个数/类型. 方法名相同,方法参数的个数或类型不同,通过个数和类型的不同来区分不同的函数; 方 ...
- java基础2:this、static、final、abstract关键字、代码块、生成API工具包、继承、多态、方法重载和重写,抽象类、接口、常见异常、java权限修饰符、选择排序思想和程序和内部类
1.this关键字 this表示当前类对象的地址空间值的引用.就是说,this代表了new出来的对象 其最大作用就是解决了构造器中局部变量隐藏成员变量.即用this.变量名 = 变量名 区分. 2.s ...
- java 方法重载的作业_java第六章 方法及方法重载 课堂笔记、作业
当参数传递为基本数据类型时,参数变化不保留,基本数据类型参数传值 当参数传递为引用数据类型时,参数变化会保留,引用数据类型参数传址 //基本数据类型在别处被重新赋值,则本体不受影响,其值不变 //引用 ...
- javaSE-day04--ArrayList基本用方法、类内定义方法和方法重载、静态方法static(类的方法)、工具方法(static)的定义和使用
ArrayList基本用方法 package day04;import java.util.ArrayList;public class ArrayListDemo {public static vo ...
最新文章
- 程序员|那天下班回家,突然民警叫住我....
- Mybatis理解与入门步骤
- YiShaAdmin_项目的默认 XML 命名空间必须为 MSBuild XML 命名空间。如果项目是用 MSBuild 2003 格式---.Net_C#_若依.Net版Web框架使用及改造001
- android 控件随手指移动_Android 实习生面试经历记录
- TCxGrid 把列移上移下。
- 事务处理笔记《一》ADO.NET级别的事务
- 第六篇 | 解决linux环境中mysql默认端口3306无法连接问题
- zz 教你如何用proxyhunter找大学代理
- standard、singleTop、singleTask、singleInstance
- android 外接键盘,安卓手机外接键盘测评
- 银行机构的分类、特点及转型方向
- 灰灰考研机试班 | 基础练习二 问题 B: 日历本 | 入门题-模拟 | 日期、星期相关计算
- 夜晚怎么能不吃宵夜呢
- 例题 9-8 颜色的长度(Color Length, ACM/ICPC Daejeon 2011, UVa1625)
- 查询出每个雇员的姓名,工资,部门名称,工资在公司的等级及其领导的姓名,领导的工资,以及领导所对应的等级
- 彻底禁用停用杀死WIN10的自动更新
- MySQL 设置和取消“ON UPDATE CURRENT_TIMESTAMP”
- 复数中的运算符重载(续)
- 路由器ACL(访问控制列表)的类型及配置
- 什么是swift闭包?
热门文章
- hive mysql互导_利用Sqoop实现Hive的数据与MySQL数据的互导
- 时间复杂度和空间复杂度探究
- php提前终止,由于最大执行时间致命错误,PHP cron作业提前终止
- windowfullscreen后键盘布局顶上去_什么才是第一生产力-2.4G高斯83G双模机械键盘终入囊...
- matlab 非线性方程组画图,使用matlab进行非线性方程组求解
- mySQL危险命令_MYSQL教程Linux系统中最危险的10条命令
- 二本类 计算机类 大学录取分数线,重庆邮电大学什么专业实力最强?为什么二本专业都超一本线录取?...
- shell脚本发邮件内容html,Shell发送邮件以HTML展示
- mysql cluster安装配置_mysqlcluster安装与配置_MySQL
- php删除表格命令,数据表格-删除