儿童类函数调用父类的构造两次

问题描述 投票:-1回答:1

我有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();
?>

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

php pdo
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.