Свойство родительского класса устанавливается пустым родительским методом при доступе из дочернего метода - PullRequest
1 голос
/ 31 июля 2011

Мне трудно понять, почему я могу получить доступ к свойству из родительского класса, но оно равно NULL, даже если оно уже было установлено родителем (и не было сознательно сброшено).Я подумал, что это может быть связано с тем, что это свойство было установлено закрытым методом, но без разницы, когда я изменил на public.Вот радикально упрощенный пример:

class TheParent
{

    protected $_parent_property;

    function __construct()
    {}

    private function parent_method($property);
    {
        $this->_parent_property = $property;
            $call = new TheChild;
            $call->child_method();
    }
}

class TheChild extends TheParent
{ 
    function __construct()
    {
        parent::construct();
    }

    public function child_method();
    {
        echo $this->_parent_property;
            exit;
    }
}

$test = new TheParent;
$test->parent_method('test');

Я работал над этим, передавая родительское свойство потомку, когда потомок создается родителем, т.е. new TheChild($this->_parent_property), но я все еще не понимаю, почему $ this-> _ parent_property устанавливается в NULL при доступе от дочернего элемента в моем исходном примере.

Я знаю, что если я установлю это свойство из родительского конструктора, я смогу получить к нему доступ просто отлично,Я пытаюсь понять, почему свойство, установленное родительским методом и доступное другими родительскими методами, не доступно из дочернего класса, который расширяет родительский.

Кто-нибудь может объяснить?Спасибо!

Ответы [ 2 ]

3 голосов
/ 31 июля 2011

Проблема в том, что вы создаете новый экземпляр, в котором переменная не установлена.Свойство привязано к конкретному экземпляру, поэтому вы создаете один экземпляр родительского элемента, а затем из родительского экземпляра другой экземпляр дочернего элемента, который включает в себя все материалы, создаваемые новым родителем, включая $_parent_property.Когда вы читаете значение в дочернем элементе, вы читаете значение только что созданного родительского элемента, а не того, который вы создали ранее.

Фактически вы делаете это:

A = new TheParent()
A->_parent_property = 'test'

Звонки: B = new TheChild() под одеялом, это делает new TheParent()

Print B->_parent_property (который был неинициализирован)

Рассмотрим аналогичный пример, который даст ожидаемый результат:

class TheParent
{

    protected $_parent_property;

    function __construct()
    {
        parent_method();
    }

    private function parent_method();
    {
        $this->_parent_property = 'test';
    }
}

class TheChild extends TheParent
{ 
    function __construct()
    {
        parent::construct();
    }

    public function child_method();
    {
        echo $this->_parent_property;
        exit;
    }
}

$child = new TheChild();
$child->child_method();

В этом примере закрытый метод в TheParent вызывается для того же экземпляра, созданного TheChild, что задает базовую переменную экземпляра.

2 голосов
/ 31 июля 2011

Вы немного ошибочно представляете, как работает наследование.

TheParent - это класс, а TheChild - это класс, основанный на TheParent.$test теперь является экземпляром TheParent.Он не знает, что существует другой класс TheChild, основанный на классе TheParent.

. Вы создаете новый экземпляр $call, который имеет тип TheChild.Это, если использовать другое слово, новый объект.Он не имеет ничего общего с $test, за исключением того, что оба «совместимы» с TheParent.

TheChild ($call) наследует свойство _parent_property от его родителя (класса).Однако это свойство не инициализируется / не устанавливается в этом экземпляре (объекте), поэтому оно все еще равно NULL.

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