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.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,612评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,744评论 2 17
  • 8/16 以终为始 节选自《高效能人士的7个习惯》 R:(Reading,阅读一个图书片段) “以终为始”的意思 ...
    鲍Lynphan阅读 412评论 1 1
  • 一个被认知偏差的臆想所束缚的人,在采取明确的行动之前,很容易产生许多乱七八糟的想法。然后他就会因为这些想法降低对自...
    可乐君CC阅读 1,276评论 0 1