专注于WEB技术的IT博客

php面向对象之子类中重载父类的方法

时间:2013-04-11分类: php浏览:16939
分享到:

因为在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."岁了" ;  
          } 
                                      
}
?>



猜你喜欢
php面向对象之__autoload()
php面向对象之__call处理错误调用
php面向对象之__toString()
PHP面向对象之const常量修饰符
php面向对象之final的应用
php面向对象之克隆对象
PHP面向对象之对象和引用
php面向对象之类的静态成员
php面向对象的访问类型控制
php面向对象编程之类的继承性
标签 : php 面向对象
除非注明,本文首发网志博客,欢迎转载!转载请注明本文地址:http://w3note.com/web/100.html,谢谢。
  • 评论
  • 赞助本站