@tukreb

Хак/хитрость области видимости переменных и методов?

Всем добрый день!

Не бейте сильно за очень глупый вопрос :)
Я знаю, как работает область видимости для переменных/свойств и методов в общих чертах.
Private - видны только из своего же класса
Protected - видны из наследованных
и т.д

В общем довольно давно поверхностно программирую или вношу правки в чужие проекты и не встречал ничего подобного, посему хочу удостоверится своему невежеству. (:
Сегодня написал такую рекурсию:

class InstalledItem 
{
    //.....
    public function getIntoItem(): Item
    {
        return $this->intoItem;
    }

    public function getRoot(): Item
    {
        return $this->getRootInternal();
    }

    private function getRootInternal(Item $item = null): Item
    {
        if(isset($item) && !$item->isItemInstalled()) {
            return $item;
        }
        /** @var InstalledItem $installedItem */
        $installedItem = $this->getIntoItem()->getHasInstalledItems()->first();
        return $installedItem->getRootInternal($this->getIntoItem()->getInstalledItem()->getIntoItem());
    }
}

Меня удивило, что рекурсия работает, несмотря на то, что как бы вызывается приватный метод из объекта класса InstalledItem , который достаётся из другого объекта Item. (Item->InstalledItem->private)
То есть я правильно понимаю, что приватные свойства и методы становятся доступны для объекта InstalledItem в этом же классе InstalledItem, даже если я достаю его из объекта другого класса (в данном примере из Item) и это работает не только для PHP, а вообще во всех языков, где есть классы?

Спасибо.
  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
@Nolan81
программист
А неважно откуда вы достаете этот второй объект, важен его тип, а он такой же.
Поэтому и имеет доступ, вот в доках.

Это в php так, в других ООП языках может и нет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы