Всем добрый день!
Не бейте сильно за очень глупый вопрос :)
Я знаю, как работает область видимости для переменных/свойств и методов в общих чертах.
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, а вообще во всех языков, где есть классы?
Спасибо.