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

  • Автор темы Автор темы 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();

а тут эта логика не работает
 
приватные свойства не наследуются, но доступ к ним можно получит в контексте родителя
публичные и протектед свойства наследуются + могут переопределяться
 
Понимаете, нет никакого "контекста".
Есть объект (да да, он первичен). Объект описан набором классов объединенных в иерархию.
Доступ к стойствам и методам объекта определяется модификаторами доступа: если приватный, то доступ к нему имеет только тот код, который принадлежит тому же классу. Если протектед или паблик - то доступ к наивысшему найденному в иерархии классов вне зависимости от положения вызываемого кода.
 
Товарищ топикстартер! Кончайте себе мозги говном забивать!
Не понимаете короткого объяснения? Ладно, объясняю на пальцах.
Вы - объект-потомок. Ваш объект-предок по достижении вами совершеннолетия одарил вас персональной(private) копией фамильного… ну, скажем, перстня. Перстень - атрибут вас как объекта. Вы можете его поцарапать или инкрустировать брильянтами; оригинальный перстень, принадлежащий вашему объекту-предку, от этого никак не пострадает.
На то же самое соершеннолетие, в силу традиции наследования, вы, объект-потомок, вступили в совладение семейной виллы на канарах. С бассейном и парком. Вилла - общий семейный аттрибут. Если вы решите посрать в бассейн, вся семья обратит на это внимание.
 
Представьте, что this указывает на хэш-таблицу, где хранятся пары имя->метод и имя->атрибут. this указывает на собственную таблицу и она содержит все члены класса, по этому доступны все члены собственного класса независимо от спецификатора доступа. А parent = this->parent указывает на таблицу базового класса. Если this->имя отсутствует в собственной хэш-таблице, то выполняется поиск this->parent->имя. Так вот, в parent попадают только public и protected члены базового класса. А private членов там нет. Когда делаешь $this->имя_приватного_из_базового_класса, то это фактически создание записи в локальной хэш-таблице. Хотя имена совпадают, никакой связи между этими членами нет.
 
Товарищ топикстартер! Кончайте себе мозги говном забивать!
вы, объект-потомок, вступили в совладение семейной виллы на канарах. С бассейном и парком. Вилла - общий семейный аттрибут. Если вы решите посрать в бассейн, вся семья обратит на это внимание.
Товарищ эксперт, кончайте новичкам мозги говном забивать ;)
У 2 разных объектов, созданных от разных классов-наследников, бассейны будут разные.

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

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