Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: область видимости

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
lexxl
Отправлено: 11 Марта, 2013 - 09:59:20
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Март 2013  


Помог: 0 раз(а)




Добрый день сотоварищи, не первый день занимаюсь программированием на php, но случилось так что начал тупить обнаружив для себе (устоявшуюся в моей голове) не очевидную (для меня) вещь, и не могу логически разобраться. Помогите, пожалуйста!

Мы имеем класс суперкласс А:
PHP:
скопировать код в буфер обмена
  1. class A {
  2.         private $name = 'default';
  3.        
  4.         function __conctructor( $name ) {
  5.                 $this -> name = $name;
  6.         }
  7.                        
  8.         public function getName() {
  9.                 return $this -> name;
  10.         }
  11. }


Далее "пишем" класс наследник В:

да, он пустой но нужен для проверки.

Использование:
PHP:
скопировать код в буфер обмена
  1. $b = new B('Виктор');
  2. echo $b->getName().'<br>';


Результат:


Я всегда понимал, что если свойство не найдено в дочернем классе то будет произведен поиск в родительском классе, ок, - но свойство name тут закрытое, т.е. не должно никоим образом "находится", а вместо него должно создаться динамически свойство name для класса B и пристроиться переданное знаечение т.е. "Виктор", по крайне мере я так усвоил из док-ции, перечитав ее еще раз, пытаясь найти зацепки, я ничего нового не вычитал. Как мы получили "default" - помогите разобраться, я впал в дичайший ступор..

p.s.: пробовал даже сделать переопределение конструктора, думая что может это из-за пустого класса B (да понимаю что глупо),
PHP:
скопировать код в буфер обмена
  1. class B extends A {
  2.         function __constructor( $name ) {
  3.                 parent::__constructor( $name );
  4.         }
  5. }

но рез-тат такой же
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Марта, 2013 - 10:05:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Вместо private пишем protected и все.
 
 Top
LIME
Отправлено: 11 Марта, 2013 - 10:09:07
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




DeepVarvar вопрос не как а почему
мне вот тоже интересно стало...
(Добавление)
PHP:
скопировать код в буфер обмена
  1. class B extends A {
  2.         function __constructor( $name ) {
  3.                 $this -> name = $name;
  4.         }
  5. }
а так?
 
 Top
EuGen Администратор
Отправлено: 11 Марта, 2013 - 10:11:55
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




lexxl пишет:
class B extends A {
function __constructor( $name ) {
parent::__constructor( $name );
}
}

Потому что конструктор в PHP - есть другой "магический метод", с именем __construct, но никак не __constructor; при создании дочернего объекта конструкторы родительских не вызываются (без явного на то указания в коде), стало быть, в оригинальном случае имело место быть наследование значения по-умолчанию без инициализации в конструкторе. Вдобавок свойство определено как приватное, что означает, что доступа к нему у потомков не будет, однако же, так как в классе B не переопределен метод, обращающийся к данному свойству, будет вызван соответствующий метод родителя (то есть класса A), который установит данное свойство.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
LIME
Отправлено: 11 Марта, 2013 - 10:15:24
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Семееен Семеныч
 
 Top
Мелкий Супермодератор
Отправлено: 11 Марта, 2013 - 10:15:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Метод getName в классе B не переопределён - вызывается в контексте класса A, где это приватное свойство существует.


-----
PostgreSQL DBA
 
 Top
lexxl
Отправлено: 11 Марта, 2013 - 10:18:42
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Март 2013  


Помог: 0 раз(а)




Простите, а где вы увидели что я использую это свойство как pablic, более того к нему обращаюсь через "геттер" (в см. зачем мне делать его защищенным, оно должно быть закрытым, а "это" почему-то не работает )
Моя проблема как раз в том чтобы обеспечить сокрытие переменной для классов наследников, что должно выполнять объявление private. А в приведенном мною примере мы смогли получить значение скрытой переменной в родителе, в контексте наследника.. Как такое произошло?
 
 Top
LIME
Отправлено: 11 Марта, 2013 - 10:21:40
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




lexxl пишет:
Моя проблема как раз в том чтобы обеспечить сокрытие переменной для классов наследников
все верно
она сокрыта для методов наследника
(Добавление)
попробуй определить геттер в наследнике
 
 Top
lexxl
Отправлено: 11 Марта, 2013 - 10:28:38
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Март 2013  


Помог: 0 раз(а)




Сорри, не увидел пока писал, что уже были ответы.
Конечно же не __constructor а __construct (это торопился)

PHP:
скопировать код в буфер обмена
  1. class A {
  2.         private $name = 'default';
  3.        
  4.         function __construct( $name ) {
  5.                 $this -> name = $name;
  6.         }
  7.                        
  8.         public function getName() {
  9.                 return $this -> name;
  10.         }
  11. }
  12.  
  13. class B extends A {
  14.         function __construct( $name ) {
  15.                 parent::__construct( $name );
  16.         }
  17. }
  18.  
  19. $b = new B('Виктор');
  20. echo $b->getName().'<br>';


результат как я писал ранее "default"

но, блин, ведь по идее наследуемый класс расширяет родительский, т.е. как я представлял наследуемый класс - это "итоговый как бы написанный нами класс", а получается что потомок как бы многослойный?

(Отредактировано автором: 11 Марта, 2013 - 10:31:40)

 
 Top
LIME
Отправлено: 11 Марта, 2013 - 10:31:08
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




не совсем...в потомок передаются не копии наследуемых методов/свойств, а ссылки на них, вернее даже просто на родителя ссылка
 
 Top
lexxl
Отправлено: 11 Марта, 2013 - 10:36:19
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Март 2013  


Помог: 0 раз(а)




Т.е. получается что при создании экземпляра класса(объекта), будет создан не экземпляр по склеенному шаблону (т.е. как-бы по итоговому классу), а будут созданы все экземпляры родительских классов и перекрывающий наследуемый который по мере надобности будет вызывать(в см. интерпритатор) не свои методы, а методы "вышестоящих" объектов? ... (бред написан, но думаю вы поняли, что я описываю)

(Отредактировано автором: 11 Марта, 2013 - 10:38:38)

 
 Top
LIME
Отправлено: 11 Марта, 2013 - 10:39:23
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




собственно да...это можно увидеть по ошибкам
иногда они возникают в родителе иногда в потомке
 
 Top
lexxl
Отправлено: 11 Марта, 2013 - 10:44:20
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Март 2013  


Помог: 0 раз(а)




Спасибо большое, кажется до меня доходит как это происходит, и что вполне логически. Стыдно признать, что за плечами многолетняя практика, и в даже неплохо оперирую гофавскими шаблонами, а тут бац - и оказывается в основах плаваю...
 
 Top
LIME
Отправлено: 11 Марта, 2013 - 10:47:22
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




погоди...
lexxl пишет:
результат как я писал ранее "default"
вот этого не должно быть
доступ возможен из методов родителя ...да
но конструктор должен Виктора делать
 
 Top
lexxl
Отправлено: 11 Марта, 2013 - 10:49:37
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Март 2013  


Помог: 0 раз(а)




я этого не переживу... ну давайте найдем где я дурак пожалуйста, только не говорите что оно работает не так как должно :\
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB