我有2班命名为C和P如下:
<?php
class P{
var $a;
function __construct(){
echo "hello";
}
function func($a){
echo "parent";
}
}
class C extends P{
function func($a){
echo "child";
}
function callpar(){
parent::__construct();
}
}
$obj=new C;
$obj->callpar();
?>
为什么我的输出显示喂两次?我只是想调用父类的构造一次。
父类的构造应该只从孩子构造方法中调用。
如果一个子类没有它本身的构造,在父类的构造时自动调用(如你的情况)。
如果一个子类确实有它的自己的构造并且不调用里面的父类的构造,警告显示Parent Constructor is Not Called
。你必须显式调用在孩子的构造函数的父类的构造。有些语言做到这一点暗示(如C#),但PHP没有。 Java的甚至迫使你调用父类的构造函数在孩子的构造函数的第一行。
看看下面这两个例子:
class P {
function __construct() {
echo 'P';
}
}
class C extends P {
// this child class doesn't have it's own constructor, so the parent constructor is called automatically
}
class D extends P {
// this class has it's own constructor, so you must explicitly call the parent constructor inside of it
function __construct() {
parent::__construct();
echo 'D';
}
}
$c = new C; // outputs P
$d = new D; // outputs PD