关于类继承,总有一个常见的问题,这就是构造函数的使用。
子类实例化时会执行父类的构造函数吗?
如果是这样,倘若子类也有自己的构造函数会怎么样?
子类构造函数在父类构造函数之后执行,还是会覆盖父类的构造函数?
先来看一个简单的例子:
<?php
class Fruit {
public function __construct($name)
{
echo '水果'.$name.'创建了';
}
}
class Apple extends Fruit {
public function __construct($name)
{
parent::__construct($name);
}
}
$apple = new Apple("苹果");
// 输出 水果苹果创建了
?>
构造函数的继承节省的是代码的重写,而不是方法的声明,也就是说,在父类中声明的构造函数必须再在子类中声明一次,其实,这也是一个重写的过程。
PHP的构造函数继承必须满足以下条件:
- 当父类有构造函数的声明时,子类也必须有声明,否则会出错。
- 在执行父类的构造函数时,必须在子类中引用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!";
}
猜你喜欢:
暂无回复。