Покинул форум
Сообщений всего: 7
Дата рег-ции: Март 2013
Помог: 0 раз(а)
Добрый день сотоварищи, не первый день занимаюсь программированием на php, но случилось так что начал тупить обнаружив для себе (устоявшуюся в моей голове) не очевидную (для меня) вещь, и не могу логически разобраться. Помогите, пожалуйста!
Я всегда понимал, что если свойство не найдено в дочернем классе то будет произведен поиск в родительском классе, ок, - но свойство name тут закрытое, т.е. не должно никоим образом "находится", а вместо него должно создаться динамически свойство name для класса B и пристроиться переданное знаечение т.е. "Виктор", по крайне мере я так усвоил из док-ции, перечитав ее еще раз, пытаясь найти зацепки, я ничего нового не вычитал. Как мы получили "default" - помогите разобраться, я впал в дичайший ступор..
p.s.: пробовал даже сделать переопределение конструктора, думая что может это из-за пустого класса B (да понимаю что глупо),
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
lexxl пишет:
class B extends A {
function __constructor( $name ) {
parent::__constructor( $name );
}
}
Потому что конструктор в PHP - есть другой "магический метод", с именем __construct, но никак не __constructor; при создании дочернего объекта конструкторы родительских не вызываются (без явного на то указания в коде), стало быть, в оригинальном случае имело место быть наследование значения по-умолчанию без инициализации в конструкторе. Вдобавок свойство определено как приватное, что означает, что доступа к нему у потомков не будет, однако же, так как в классе B не переопределен метод, обращающийся к данному свойству, будет вызван соответствующий метод родителя (то есть класса A), который установит данное свойство.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
LIME
Отправлено: 11 Марта, 2013 - 10:15:24
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
Семееен Семеныч
Мелкий
Отправлено: 11 Марта, 2013 - 10:15:32
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Метод getName в классе B не переопределён - вызывается в контексте класса A, где это приватное свойство существует.
----- PostgreSQL DBA
lexxl
Отправлено: 11 Марта, 2013 - 10:18:42
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Март 2013
Помог: 0 раз(а)
Простите, а где вы увидели что я использую это свойство как pablic, более того к нему обращаюсь через "геттер" (в см. зачем мне делать его защищенным, оно должно быть закрытым, а "это" почему-то не работает )
Моя проблема как раз в том чтобы обеспечить сокрытие переменной для классов наследников, что должно выполнять объявление private. А в приведенном мною примере мы смогли получить значение скрытой переменной в родителе, в контексте наследника.. Как такое произошло?
LIME
Отправлено: 11 Марта, 2013 - 10:21:40
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
lexxl пишет:
Моя проблема как раз в том чтобы обеспечить сокрытие переменной для классов наследников
все верно
она сокрыта для методов наследника (Добавление)
попробуй определить геттер в наследнике
lexxl
Отправлено: 11 Марта, 2013 - 10:28:38
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Март 2013
Помог: 0 раз(а)
Сорри, не увидел пока писал, что уже были ответы.
Конечно же не __constructor а __construct (это торопился)
но, блин, ведь по идее наследуемый класс расширяет родительский, т.е. как я представлял наследуемый класс - это "итоговый как бы написанный нами класс", а получается что потомок как бы многослойный?
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
не совсем...в потомок передаются не копии наследуемых методов/свойств, а ссылки на них, вернее даже просто на родителя ссылка
lexxl
Отправлено: 11 Марта, 2013 - 10:36:19
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Март 2013
Помог: 0 раз(а)
Т.е. получается что при создании экземпляра класса(объекта), будет создан не экземпляр по склеенному шаблону (т.е. как-бы по итоговому классу), а будут созданы все экземпляры родительских классов и перекрывающий наследуемый который по мере надобности будет вызывать(в см. интерпритатор) не свои методы, а методы "вышестоящих" объектов? ... (бред написан, но думаю вы поняли, что я описываю)
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
собственно да...это можно увидеть по ошибкам
иногда они возникают в родителе иногда в потомке
lexxl
Отправлено: 11 Марта, 2013 - 10:44:20
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Март 2013
Помог: 0 раз(а)
Спасибо большое, кажется до меня доходит как это происходит, и что вполне логически. Стыдно признать, что за плечами многолетняя практика, и в даже неплохо оперирую гофавскими шаблонами, а тут бац - и оказывается в основах плаваю...
LIME
Отправлено: 11 Марта, 2013 - 10:47:22
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
погоди...
lexxl пишет:
результат как я писал ранее "default"
вот этого не должно быть
доступ возможен из методов родителя ...да
но конструктор должен Виктора делать
lexxl
Отправлено: 11 Марта, 2013 - 10:49:37
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Март 2013
Помог: 0 раз(а)
я этого не переживу... ну давайте найдем где я дурак пожалуйста, только не говорите что оно работает не так как должно :\
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.