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. <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:\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<br>";
     }
 }
 class Dog1 extends Animal {
     public function __construct(){
         $this->legNum = 4;
         echo "I am a Dog .<br>";
     }
 }
 $dog1 = new Dog1();
 echo "<br>";
 echo  "legNum is ".$dog1->legNum;
 /*
 实例化子类时.构造函数被调用了.
 */
 ?>

程序运行结果:

 I am a Dog .
  
 legNum is 4

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值