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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Derekovich
Отправлено: 01 Октября, 2013 - 23:58:40
Post Id


Гость


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


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




Ребята есть недопонимание наследования. Прошу растолковать порядок. Пример:
PHP:
скопировать код в буфер обмена
  1.  
  2. abstract class A {
  3. protected $a = "переменная абстрактного класса";
  4.  
  5. public function papa (){
  6. echo $this->$a;
  7. }
  8. }
  9.  
  10. class B extends A {
  11. protected $a = "переменная обычного класса";
  12. }
  13.  
  14. $b = new B();
  15. $b->papa();//  выведет "переменная обычного класса"
  16.  

Вопрос, мы создаем объект, вызываем метод который находится в абстрактном классе, но выводит он почему-то не содержимое "переменная абстрактного класса" а именно "переменная обычного класса". Почему? Раз мы вызвали метод абстрактного класса, то и переменная по идее должна выводить из абстрактного. Мое суждение конечно не правильное, объясните пож-та этот принцип. Спасибо!

(Отредактировано автором: 01 Октября, 2013 - 23:59:57)

 
 Top
caballero
Отправлено: 02 Октября, 2013 - 00:13:03
Post Id


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


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


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




Цитата:
Почему? Раз мы вызвали метод абстрактного класса,

в методе обращение к переменной унаследованого класса объект которого и создан

(Отредактировано автором: 02 Октября, 2013 - 00:16:28)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Мелкий Супермодератор
Отправлено: 02 Октября, 2013 - 09:41:02
Post Id



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


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


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




Derekovich пишет:
Почему?

Потому что в дочернем классе переменная переопределена, а в родительском указана как protected.

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


-----
PostgreSQL DBA
 
 Top
Derekovich
Отправлено: 02 Октября, 2013 - 10:26:42
Post Id


Гость


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


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




А зачет тогда вообще объявлять эту переменную в абстрактном классе, если ее будут переопределять... Я так понимаю, раз метода нет, php идет в абстрактный класс, нашел метод и опять возвращается к себе в родительский класс? И если не находит переменной, то тогда идет в абстрактный и использует то, что там определено?
 
 Top
Medallion
Отправлено: 02 Октября, 2013 - 17:57:40
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Май 2012  
Откуда: Херсон, Украина


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




Спецификатор доступа protected для наследников класса.
Для текущего класса следует применять private
Например:
PHP:
скопировать код в буфер обмена
  1.  
  2. abstract class A {
  3. private $a = "переменная абстрактного класса";
  4.  
  5. public function papa(){
  6.     echo $this->a;
  7. }
  8. }
  9.  
  10. class B extends A {
  11. protected $a = "переменная обычного класса";
  12. }
  13.  
  14. $b = new B();
  15. $b->papa();//  выведет "переменная абстрактного класса"
  16.  
 
 Top
esterio
Отправлено: 02 Октября, 2013 - 18:02:44
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




Medallion
И что вы етим хотели сказать?
 
 Top
caballero
Отправлено: 02 Октября, 2013 - 18:27:45
Post Id


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


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


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




Цитата:
Спецификатор доступа protected для наследников класса.
Для текущего класса следует применять private

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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB