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
Форумы портала PHP.SU :: Версия для печати :: область видимости
Форумы портала PHP.SU » » Объектно-ориентированное программирование » область видимости

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

1. lexxl - 11 Марта, 2013 - 09:59:20 - перейти к сообщению
Добрый день сотоварищи, не первый день занимаюсь программированием на 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>';


Результат:
PHP:
скопировать код в буфер обмена
  1. default


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

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

но рез-тат такой же
2. DeepVarvar - 11 Марта, 2013 - 10:05:25 - перейти к сообщению
Вместо private пишем protected и все.
3. LIME - 11 Марта, 2013 - 10:09:07 - перейти к сообщению
DeepVarvar вопрос не как а почему
мне вот тоже интересно стало...
(Добавление)
PHP:
скопировать код в буфер обмена
  1. class B extends A {
  2.         function __constructor( $name ) {
  3.                 $this -> name = $name;
  4.         }
  5. }
а так?
4. EuGen - 11 Марта, 2013 - 10:11:55 - перейти к сообщению
lexxl пишет:
class B extends A {
function __constructor( $name ) {
parent::__constructor( $name );
}
}

Потому что конструктор в PHP - есть другой "магический метод", с именем __construct, но никак не __constructor; при создании дочернего объекта конструкторы родительских не вызываются (без явного на то указания в коде), стало быть, в оригинальном случае имело место быть наследование значения по-умолчанию без инициализации в конструкторе. Вдобавок свойство определено как приватное, что означает, что доступа к нему у потомков не будет, однако же, так как в классе B не переопределен метод, обращающийся к данному свойству, будет вызван соответствующий метод родителя (то есть класса A), который установит данное свойство.
5. LIME - 11 Марта, 2013 - 10:15:24 - перейти к сообщению
Семееен Семеныч
6. Мелкий - 11 Марта, 2013 - 10:15:32 - перейти к сообщению
Метод getName в классе B не переопределён - вызывается в контексте класса A, где это приватное свойство существует.
7. lexxl - 11 Марта, 2013 - 10:18:42 - перейти к сообщению
Простите, а где вы увидели что я использую это свойство как pablic, более того к нему обращаюсь через "геттер" (в см. зачем мне делать его защищенным, оно должно быть закрытым, а "это" почему-то не работает )
Моя проблема как раз в том чтобы обеспечить сокрытие переменной для классов наследников, что должно выполнять объявление private. А в приведенном мною примере мы смогли получить значение скрытой переменной в родителе, в контексте наследника.. Как такое произошло?
8. LIME - 11 Марта, 2013 - 10:21:40 - перейти к сообщению
lexxl пишет:
Моя проблема как раз в том чтобы обеспечить сокрытие переменной для классов наследников
все верно
она сокрыта для методов наследника
(Добавление)
попробуй определить геттер в наследнике
9. lexxl - 11 Марта, 2013 - 10:28:38 - перейти к сообщению
Сорри, не увидел пока писал, что уже были ответы.
Конечно же не __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"

но, блин, ведь по идее наследуемый класс расширяет родительский, т.е. как я представлял наследуемый класс - это "итоговый как бы написанный нами класс", а получается что потомок как бы многослойный?
10. LIME - 11 Марта, 2013 - 10:31:08 - перейти к сообщению
не совсем...в потомок передаются не копии наследуемых методов/свойств, а ссылки на них, вернее даже просто на родителя ссылка
11. lexxl - 11 Марта, 2013 - 10:36:19 - перейти к сообщению
Т.е. получается что при создании экземпляра класса(объекта), будет создан не экземпляр по склеенному шаблону (т.е. как-бы по итоговому классу), а будут созданы все экземпляры родительских классов и перекрывающий наследуемый который по мере надобности будет вызывать(в см. интерпритатор) не свои методы, а методы "вышестоящих" объектов? ... (бред написан, но думаю вы поняли, что я описываю)
12. LIME - 11 Марта, 2013 - 10:39:23 - перейти к сообщению
собственно да...это можно увидеть по ошибкам
иногда они возникают в родителе иногда в потомке
13. lexxl - 11 Марта, 2013 - 10:44:20 - перейти к сообщению
Спасибо большое, кажется до меня доходит как это происходит, и что вполне логически. Стыдно признать, что за плечами многолетняя практика, и в даже неплохо оперирую гофавскими шаблонами, а тут бац - и оказывается в основах плаваю...
14. LIME - 11 Марта, 2013 - 10:47:22 - перейти к сообщению
погоди...
lexxl пишет:
результат как я писал ранее "default"
вот этого не должно быть
доступ возможен из методов родителя ...да
но конструктор должен Виктора делать
15. lexxl - 11 Марта, 2013 - 10:49:37 - перейти к сообщению
я этого не переживу... ну давайте найдем где я дурак пожалуйста, только не говорите что оно работает не так как должно :\

 

Powered by ExBB FM 1.0 RC1