PHP构造函数的继承问题

关于类继承,总有一个常见的问题,这就是构造函数的使用。子类实例化时会执行父类的构造函数吗?如果是这样,倘若子类也有自己的构造函数会怎么样?子类构造函数在父类构造函数之后执行,还是会覆盖父类的构造函数?

先来看一个简单的例子:

<?php
	class Fruit {
		public function __construct($name)
		{
			echo '水果'.$name.'创建了';
		}
	}
	
	class Apple extends Fruit {
		public function __construct($name)
		{
			parent::__construct($name);
		}
	}
	
	$apple = new Apple("苹果");
	
	// 输出 水果苹果创建了
?>

构造函数的继承节省的是代码的重写,而不是方法的声明,也就是说,在父类中声明的构造函数必须再在子类中声明一次,其实,这也是一个重写的过程。

PHP的构造函数继承必须满足以下条件:

  1. 当父类有构造函数的声明时,子类也必须有声明,否则会出错。
  2. 在执行父类的构造函数时,必须在子类中引用parent关键字。

如果父类有构造函数,而且子类没有构造函数,那么在子类实例化时确实会执行父类构造函数。例如,假设Employee类有如下构造函数:

function  __construct($name){
	$this->setName($name);
}

然后实例化CEO类,获得其name成员:

$ceo= new CEO("Gonn");
echo $ceo->getName();

将得到如下结果:

My name is Gonn

但是,如果子类也有构造函数,那么当子类实例化时,不论父类是否有构造函数,都会执行子类自己的构造函数。例如,假设除了Employee类包含上述构造函数外,CEO类也包含如下构造函数:

function  __construct(){
    echo "CEO object created!";
}

再来实例化CEO类,以同样的方式执行getName(),这次将得到不同的输出:

CEO object created!
My name is Gonn

当遇到parent::__construct()时,PHP开始沿着父类向上搜索合适的构造函数。因为在Executive中没有找到,所以继续搜索知道Employee类,在这里找到了合适的构造函数。如果PHP在Employee类中找到构造函数,就会执行这个构造函数。如果希望既执行Employee构造函数,又执行Executive构造函数,则需要在Executive构造函数中调用parent::__construct()。

此外,还可以选择另一种方式来引用父类的构造函数。例如,假设创建新的CEO对象时,Employee和Executive的构造函数都要执行。如上述,可以在CEO的构造函数中显示地引用这些构造函数,如下:

function __construct($name){
	Employee::__constrcut($name);
	Executive::__construct();
	echo "CEO object created!";
}


 

 原文链接:http://www.nowamagic.net/librarys/posts/php/34

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值