Передать переменную в расширенный класс PHP - PullRequest
4 голосов
/ 20 сентября 2009

Я уже некоторое время использую ООП в PHP, но по какой-то причине у меня полный спад мозга и я не могу понять, что здесь происходит не так!

У меня есть намного более сложный класс, но я написал более простой для тестирования, и даже это не работает ...

Может кто-нибудь сказать мне, что я делаю не так?

class test
{
    public $testvar;

    function __construct()
    {
       $this->testvar = 1;
    }
}

class test2 extends test
{
    function __construct()
    {
        echo $this->testvar;
    }
}

$test = new test;
$test2 = new test2;

Все, что я пытаюсь сделать, это передать переменную из родительского класса в дочерний класс! Клянусь, в прошлом я только что использовал $ this-> varName , чтобы получить $ varName в расширении ??

Спасибо!

Ответы [ 2 ]

15 голосов
/ 20 сентября 2009

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

Что означает, в вашем случае, что ваш класс test2 станет:

class test2 extends test
{
    function __construct()
    {
        parent::__construct();
        echo $this->testvar;
    }
}

Для получения дополнительной информации вы можете взглянуть на страницу Конструкторы и деструкторы руководства, в котором говорится о вашем вопросе:

Примечание: Родительские конструкторы не являются вызывается неявно, если дочерний класс определяет конструктор . Для того, чтобы бежать родительский конструктор, вызов parent::__construct() в пределах требуется дочерний конструктор.


Вы можете использовать $this->varName: это не проблема; рассмотрите этот код:

class test {
    public $testvar = 2;
    function __construct() {
       $this->testvar = 1;
    }
}
class test2 extends test {
    function __construct() {
        var_dump($this->testvar);
    }
}
$test2 = new test2;

Вывод:

int 2

Что является значением по умолчанию $testvar.

Это означает, что проблема не в том, что вы не можете получить доступ к этому свойству: проблема здесь только в том, что конструктор родительского класса не был вызван.

2 голосов
/ 20 сентября 2009

Ваш test2 класс должен позвонить

parent::__construct()

в своем конструкторе.

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