Защищенные свойства родителя недоступны для дочернего объекта - PullRequest
0 голосов
/ 20 мая 2019

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

  • ParentClass имеет защищенные свойства $ prop1 и $ prop2, к которым я хочу получить доступ ChildClass. Но я получаю NULL от них.

  • В ParentClass есть метод __construct (), который устанавливает свойства, полученные посредством внедрения зависимостей.

  • ParentClass создает экземпляр ChildClass из одного из его методов.

  • ChildClass перезаписывает родительский конструктор, но не содержит никакого кода внутри своего собственного метода __construct ().

Я уже тестировал свойства родительского класса с помощью var_dump ($ this-> prop1). Возвращает ожидаемое мной значение.

Однако, если я var_dump ($ this-> prop1) из дочернего класса, я получаю NULL.

class ParentClass {

    protected $prop1;

    protected $prop2;

    public function __construct($prop1, $prop2) {

        $this->prop1 = $prop1;

        $this->prop2 = $prop2;

    }

    public function fakeMethod() {

        $child = new ChildClass;
        $child->anotherFakeMethod();

        // logic

    }

}
class ChildClass extends ParentClass {

    public function __construct() {

        // this overrides the parent constructor

    }

    public function anotherFakeMethod() {

        $prop1 = $this->prop1;
        $prop2 = $this->prop2;

        var_dump($this->prop1);
        // returns NULL

    }

}

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

1 Ответ

1 голос
/ 20 мая 2019

Они доступны, но они будут null, потому что они не передаются родительскому конструктору от дочернего:

(new ChildClass(1,2))->anotherFakeMethod();

Песочница

выход

NULL

В этом случае ваши классы дают ожидаемый результат null. Ну, это производит то, что я ожидал бы, основываясь на том, как это закодировано.

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

class ChildClass extends ParentClass {

    public function __construct($prop1, $prop2) {
         parent::__construct($prop1, $prop2);
    }
....
}

После вышеуказанного изменения:

(new ChildClass(1,2))->anotherFakeMethod();

выход

int(1)

Песочница

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

var_dump($this->prop1);

Вы также можете сделать это таким образом, если вы знаете, что они в дочернем классе:

public function __construct() {
     parent::__construct(1, 2); //say I know what these are for this child
}

Конечно, вы можете установить их вручную в новом конструкторе, но это будет WET (напишите все дважды) или ненужное дублирование, в этом случае.

Ура!

...