Доступ к расширению свойств конструктора к частным переменным

Если я использую продвижение свойств конструктора, я могу вызвать конструктор автоматически. Мне не нужно писать parent::_constructor(). Но дочерний класс может получить доступ к атрибуту Private. Эту ошибку можно устранить, просто не используя Propery Promotion. Я в чем-то ошибаюсь?

class Parent {
    public function __construct(
        protected $protected,
        private $private
    ) {
    }
}

class Child extends Parent {
    public function __construct(
        protected $protected,
        private $private
    ) {
    }

    function myFunc() {
        echo $this->private; // This works!!
    }
}

Дочерний элемент объявил собственное $private свойство, независимое от родительского. Так почему же это не должно сработать?

Barmar 19.04.2024 00:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
146
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Продвижение свойства конструктора означает просто «одновременное объявление свойства и аргумента конструктора». Это не меняет того, как работают наследование и частные свойства.

Ваш код эквивалентен этому:

class Parent {
    protected $protected;
    private $private;

    public function __construct(
        $protected,
        $private
    ) {
        $this->protected = $protected;
        $this->private = $private;
    }
}

class Child extends Parent {
    protected $protected;
    private $private;

    public function __construct(
        $protected,
        $private
    ) {
        $this->protected = $protected;
        $this->private = $private;
    }

    function myFunc() {
        echo $this->private; // This works!!
    }
}

Дочерний класс никогда не затрагивает частное свойство родительского класса, он просто объявляет свое собственное частное свойство, имеющее то же имя. Если вы попытаетесь повторить $this->private в методе, определенном в Parent, вы обнаружите, что он не инициализирован: вы не запускали конструктор Parent, поэтому в него ничего не записывалось.

Продвижение свойств конструктора — это всего лишь ярлык для объявления свойств и их назначения. Итак, Child объявляет свои собственные свойства $protected и $private, которые переопределяют свойства, унаследованные от Parent. Таким образом, Child::$private является частным для класса Child и к нему можно получить доступ из методов класса Child.

Обратите внимание, что вам еще нужно вызвать Parent::__construct(). Инициализация свойств Child не инициализирует свойства Parent с такими же именами. Если вы не вызовете его, методы Parent, пытающиеся получить доступ к $this->private или $this->protected, получат ошибку для неопределенной переменной.

Другие вопросы по теме