Функция дочернего класса дважды вызывает родительский класс - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть 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();
?>

Почему мой вывод показывает привет два раза?Я просто хочу вызвать конструкцию родительского класса на один раз.

1 Ответ

0 голосов
/ 06 февраля 2019

Родительский конструктор должен вызываться только из дочернего конструктора.

Если у дочернего класса нет собственного конструктора, родительский конструктор вызывается автоматически (как в вашем случае).

Если дочерний класс имеет свой собственный конструктор и не вызывает внутри родительского конструктора, отображается предупреждение Parent Constructor is Not Called.Вы должны явно вызвать родительский конструктор в дочернем конструкторе.Некоторые языки делают это неявно (например, C #), но PHP этого не делает.Java даже заставляет вас вызывать родительский конструктор в первой строке дочернего конструктора.

Посмотрите на эти 2 примера ниже:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...