Как работает Наследование и область видимости в PHP?

<?php
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}

public function testPublic() {
echo "Bar::testPublic\n";
}

private function testPrivate() {
echo "Bar::testPrivate\n";
}
}

class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}

private function testPrivate() {
echo "Foo::testPrivate\n";
}
}

myFoo = new Foo();
$myFoo->test(); // Bar::testPrivate 
// Foo::testPublic


Паблик он берет из дочерного класса,
А приватный из своего.
Что совсем не логично.
Ведь он не может достать ПриватныйМетод. Ведь он не наследуется.

public function test() {
$this->testPrivate();//По сути в обьекте нашего класса его нет, он же не наслежуется, т.к. Приватное
$this->testPublic();
}

И это первый вопрос, каким образом это работает, ЧТО ВЫЗЫВАЕТСЯ МЕТОД КОТОРЫЙ НЕ НАСЛЕДУЕТСЯ, в других языках я вроде такого не встречал.

ВТОРОЕ.Я думал что т.к. я наследовал класс, то теперь типо test есть в моем наследованном классе, и он может работать со всеми моими методами. Но вызвать Приватный метод в дочернем классе он не может.
  • Вопрос задан
  • 283 просмотра
Пригласить эксперта
Ответы на вопрос 1
IgorPI
@IgorPI
Давай по порядку.
По теме наследования.

Небольшой пример.
<?php


namespace Engine;


abstract class Foundation
{
    /**
     * Арматура (mm)
     * Я не хочу что бы моя арматура торчала из моего фундамента
     * Поэтому принял решение что этот параметр не выйдет за пределы класса
     * @var integer
     */
    private $fittings = 15;


    /**
     * Балка
     * Балка будет видна, прежде чем я постелю полы
     * Я планирую ещё работать с полом и мне нужен доступ к балкам
     * Которые лежат на фундаменте
     * @var string
     */
    protected $beam = "Охренительно ровная балка";


    /**
     * Мне нужен доступ в подвал
     * Я так же могу получить доступ к своему фундаменту
     * И возможно подогнуть торчащу арматуру из моего горе фундамента
     * @var string
     */
    public $сellar = "Вход в погреб";

    /**
     * Foundation constructor.
     */
    public function __construct()
    {
        // Строю дом
    }
}


<?php


namespace Engine;

/**
 * Стены
 * Я наслудую базовый класс Foundation
 * У меня есть доступ к балке.
 * Но у меня нет доступа к арматуре
 * Арматура была залита бетоном.
 *
 * Class Walls
 * @package Engine
 */
class Walls extends Foundation
{
    /**
     * Окно
     * @var string
     */
    protected $window;

    /**
     * Дверь
     * @var string
     */
    protected $door;

    /**
     * Walls constructor.
     */
    public function __construct()
    {
        parent::__construct();

        $beam = $this->beam; // Пожалуй воспользуюсь балкой
    }


    // здесь что-то будем делать со стенами
}


<?php


namespace Engine;


/**
 * Крыша
 * Class Roof
 * @package Engine
 */
class Roof extends Walls
{
    /**
     * Roof constructor.
     */
    public function __construct()
    {
        parent::__construct();
        // Я всё ещё имею к ним доступ, но только внутри класса
        $this->beam;
        $this->door;
        $this->window;
        $this->сellar;
    }
}


Строю дом, но у меня есть только доступ к подвалу (((
$home = new Walls();
$home->сellar;


Не умею стоить дома.

Прилагаю диаграмму
5d6d9b8e96b10054415644.png

Наследование классов можно сравнить с наследованием в жизни, от отца к сыну./
У тебя или есть наследство
Или нет
Или есть, но ты воспользоваться не можешь.

Главное что есть вход в подвал!
Это важно!
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы