打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
php面向对象中子类中重载父类详解
www.111cn.net 编辑:netuser 来源:转载
本文章来给大家整理一下关于php面向对象中子类中重载父类详解,希望此文章对各位理解php子类中重载父类有所帮助哦。
因为在PHP中不能存在同名的函数,所以在同一个类中也就不能定义重名的方法。这里所说的重载是指在    子类中可以定义和父类同名的方法从而覆盖从父类中继承过来的方法。
子类中重载父类的方法
代码如下 复制代码
<?php
class Person{
public $name;
public function __construct($name="" ){
$this->name =$name;
}
public  function say(){
echo "我叫".$this->name  ;
}
}
?>
<?php
class Student extends Person{
public $name;
public function __construct($name=""){
$this->name =$name;
}
//这里定义了一个和父类中同名的方法,将父类中的说话方法覆盖并重写
public  function say(){
echo "我叫".$this->name .",今年25岁了" ;
}
}
?>
重写方法与访问权限
子类中的覆盖方法不能使用比父类中被覆盖方法更严格的访问权限。
如果父类中的方法的访问权限是protected,那么子类中重写的方法的权限就要是protected或者public;    如果父类中的方法是public,那么子类要重写的方法的权限就只能是public。也许这也就是为什么子类可    以继承父类的私有成员,但却不能使用的原因吧。
重写时的参数数量
子类可以拥有与父类不同的参数数量,如下面的构造方法中,多添加了一个参数$age。
代码如下 复制代码
<?php
class Student extends Person{
public $name;
public $age;
public function __construct($name="",$age=25){
$this->name =$name;
$this->age =$age;
}
public  function say(){
echo "我叫".$this->name .",今年".$this->age."岁了" ;
}
}
?>
构造函数重写
上面提到的“重写时的参数数量”就已经实现了子类对父类的构造函数进行了重写,但这不是一种好的写    法,如果仔细观察,你会发现,上面子类Student对父类Person构造函数的重写,其实就是在父类的构造    函数的基础上多添加了一个参数,但是又把父类原有的参数照写一遍,因为父类Person的构造函数只有一    个参数,所以我们照写一遍不觉得有什么麻烦,但是如果参数不止一个,而是几个或者更多,那么你就会    发现它的繁琐之处,那么有没有办法可以简化这个问题呢?答案是肯定的,可通过使用"parent::方法名"    在子类的重载方法中调用父类中被它覆盖的方法。如使用"parent::__construct()"调用父类中被覆盖的    构造方法,其它方法的类似,于是上面的代码可以简化为:
代码如下 复制代码
<?php
class Student extends Person{
public $name;
public $age;
public function __construct($name="",$age=25){
parent::__construct($name,$age);
$this->age =$age;
}
public  function say(){
parent::say();
echo ",今年".$this->age."岁了" ;
}
}
?>
下再看一个实例
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. <br>";
echo $dog->yaff() ."<br>".$dog->run();
echo  "<br><br>";
//这是我的小狗叫"狗狗",它很小.不会汪汪叫,只会哼哼哼..
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. <br>";
echo $myDog->yaff() ."<br>".$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:PHPProjectstest.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:PHPProjectstest.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.
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C#接口(Interface)用法分析
父类强制转换子类出错
方法的重载和重写
java学习总结-高级语言特性-封装,继承,多态
父类引用指向子类对象:父类名 对象名=new 子类名();
JAVA程序执行顺序,你了解了吗?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服