Почему мой дочерний класс PHP не получает открытые и защищенные переменные от родительского? - PullRequest
2 голосов
/ 25 мая 2011

У меня бредает мозг, и я подозреваю, что это действительно просто. Рассмотрим этот код с двумя классами:

<?php    
class myparentclass {
    protected $vara;
    private $varb;
    public $varc;
    public $_childclass;

    function __construct() {
        $this->vara = "foo";
        $this->varb = "bar";
        $this->varc = ":(";
        $this->_childclass = new mychildclass;    
    }
}

class mychildclass extends myparentclass {
    function __construct() {
        print_r ($this);
    }
}

print "<pre>";
$foo = new myparentclass();

Вывод:

mychildclass Object
(
    [vara:protected] => 
    [varb:private] => 
    [varc] => 
    [_childclass] => 
)

Я знаю, что $ varb не следует устанавливать, но как насчет остальных?

Ответы [ 6 ]

4 голосов
/ 25 мая 2011

Если вы определяете новый __construct() в дочернем классе, как вы это сделали для печати переменных, вам также необходимо явно вызвать конструктор родителя. Если вы не определили какой-либо __construct() в дочернем классе, он бы непосредственно наследовал родительский класс, и все эти свойства были бы установлены.

class mychildclass extends myparentclass {
  function __construct() {
    // The parent constructor
    parent::__construct();
    print_r ($this);
  }
}
2 голосов
/ 25 мая 2011

Если вы переопределите конструктор в своем дочернем классе, вы должны вызвать родительский конструктор.

2 голосов
/ 25 мая 2011

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

function __construct() {
        parent::__construct();
        print_r ($this);
    }
1 голос
/ 25 мая 2011

Вы переопределяете конструктор родительского класса конструктором в родительском классе.Вы можете вызвать конструктор родителя из вашего дочернего класса с parent :: __ construct ();

Однако последняя строка конструктора myparentclass вызывает конструктор mychildclass, который, в свою очередь, вызывает родительский конструктор и так далее.Вы хотели этого достичь?

<?php    
class myparentclass {
    protected $vara;
    private $varb;
    public $varc;

    function __construct() {
        $this->vara = "foo";
        $this->varb = "bar";
        $this->varc = ":(";
    }
}

class mychildclass extends myparentclass {
    function __construct() {
        parent::__construct();
        print_r ($this);
    }
}

print "<pre>";
$foo = new mychildclass();
1 голос
/ 25 мая 2011

Ваш родительский конструктор никогда не выполняется дочерним элементом. Измените mychildclass следующим образом:

function __construct() {
    parent::__construct();
    print_r ($this);
}
1 голос
/ 25 мая 2011

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

parent::__construct();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...