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

karpov

Новичок
в итоге что я вижу
приватные свойства не наследуются, но доступ к ним можно получит в контексте родителя
публичные и протектед свойства наследуются + могут переопределяться
хотя плохо понимаю

Код:
class Foo {
    protected $var = 42;
    public function getVar()
    {
        print $this->var;
    }
}

class Bar extends Foo {
    protected $var = 43;
    public function getVar()
    {
        parent::getVar();
    }
}

(new Bar)->getVar();//43
^
| почему 43 если метод вызван из контекста родителя

Код:
class Foo {
    private $var = 42;
    public function getVar()
    {
        print $this->var;
    }
}

class Bar extends Foo {
    private $var = 43;
    public function getVar()
    {
        parent::getVar(); //42
        print $this->var; //43
    }
}

(new Bar)->getVar();
а тут эта логика не работает
 

MiksIr

miksir@home:~$
приватные свойства не наследуются, но доступ к ним можно получит в контексте родителя
публичные и протектед свойства наследуются + могут переопределяться
 

MiksIr

miksir@home:~$
Понимаете, нет никакого "контекста".
Есть объект (да да, он первичен). Объект описан набором классов объединенных в иерархию.
Доступ к стойствам и методам объекта определяется модификаторами доступа: если приватный, то доступ к нему имеет только тот код, который принадлежит тому же классу. Если протектед или паблик - то доступ к наивысшему найденному в иерархии классов вне зависимости от положения вызываемого кода.
 

AnrDaemon

Продвинутый новичок
Товарищ топикстартер! Кончайте себе мозги говном забивать!
Не понимаете короткого объяснения? Ладно, объясняю на пальцах.
Вы - объект-потомок. Ваш объект-предок по достижении вами совершеннолетия одарил вас персональной(private) копией фамильного… ну, скажем, перстня. Перстень - атрибут вас как объекта. Вы можете его поцарапать или инкрустировать брильянтами; оригинальный перстень, принадлежащий вашему объекту-предку, от этого никак не пострадает.
На то же самое соершеннолетие, в силу традиции наследования, вы, объект-потомок, вступили в совладение семейной виллы на канарах. С бассейном и парком. Вилла - общий семейный аттрибут. Если вы решите посрать в бассейн, вся семья обратит на это внимание.
 

whirlwind

TDD infected, paranoid
Представьте, что this указывает на хэш-таблицу, где хранятся пары имя->метод и имя->атрибут. this указывает на собственную таблицу и она содержит все члены класса, по этому доступны все члены собственного класса независимо от спецификатора доступа. А parent = this->parent указывает на таблицу базового класса. Если this->имя отсутствует в собственной хэш-таблице, то выполняется поиск this->parent->имя. Так вот, в parent попадают только public и protected члены базового класса. А private членов там нет. Когда делаешь $this->имя_приватного_из_базового_класса, то это фактически создание записи в локальной хэш-таблице. Хотя имена совпадают, никакой связи между этими членами нет.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Товарищ топикстартер! Кончайте себе мозги говном забивать!
вы, объект-потомок, вступили в совладение семейной виллы на канарах. С бассейном и парком. Вилла - общий семейный аттрибут. Если вы решите посрать в бассейн, вся семья обратит на это внимание.
Товарищ эксперт, кончайте новичкам мозги говном забивать ;)
У 2 разных объектов, созданных от разных классов-наследников, бассейны будут разные.

А если ты про static protected - то выпей йаду потому что это нарушение инкапсуляции и Лисковой, и так делать не надо в принципе :)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
пример с семьей подразумевает родителя и несколько наследников - то есть несколько объектов или хотя бы несколько разных классов

может, просто пример неудачный
 

AnrDaemon

Продвинутый новичок
Просто пример неудачный. Согласен.
Для прояснения конкретной ситуации хватит, но общей теории он не покрывает.
 
Сверху