PHP构造函数的继承问题

服务器君一共花费了5.043 ms进行了6次数据库查询,努力地为您提供了提供了这个页面。

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

先来看一个简单的例子:

<?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!";
}

Creative Commons License

本文仅供自己学习与收藏之用,请勿转载,请勿用作其它用途(如商业目的等)。 原文链接:http://www.nowamagic.net/librarys/posts/php/34