子类函数调用父类构造两次

时间:2019-02-06 07:06:08

标签: php pdo

我有两个名为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();
?>

为什么我的输出显示两次问候?我只想一次调用父类构造。

1 个答案:

答案 0 :(得分:0)

仅应从子构造函数调用父构造函数。

如果子类没有它自己的构造函数,则将自动调用父构造函数(如您的情况)。

如果子类确实具有其自己的构造函数且未在内部调用父构造函数,则会显示警告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