php 中如何重载父类的方法_php面向对象中子类中重载父类详解

因为在PHP中不能存在同名的函数,所以在同一个类中也就不能定义重名的方法。这里所说的重载是指在 子类中可以定义和父类同名的方法从而覆盖从父类中继承过来的方法。

子类中重载父类的方法

class Person{

public $name;

public function __construct($name="" ){

$this->name =$name;

}

public function say(){

echo "我叫".$this->name ;

}

}

?>

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。

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()"调用父类中被覆盖的 构造方法,其它方法的类似,于是上面的代码可以简化为:

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.
";

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: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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值