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 :: destuct родителя. да и construct тоже

 PHP.SU

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


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

> Описание: должен вызываться сам?
Быколай
Отправлено: 08 Октября, 2011 - 20:04:22
Post Id



Новичок


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


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




здесь http://php.su/learnphp/phpoo/?php5 написано:
Цитата:
Конструкторы в классах-родителях не вызываются автоматически. Чтобы вызвать конструктор, объявленный в родительском классе, следует обратиться к методу parent::__construct().

и
Цитата:
Как и в случае с конструкторами, деструкторы, объявленные в родительском классе, не будут вызваны автоматически. Для вызова деструктора, объявленном в классе-родителе, следует обратиться к методу parent::__destruct().

на практике получаю вызов и того и другого, когда создаю наследника, в котором эти методы не переопределены.
то есть код:
PHP:
скопировать код в буфер обмена
  1.  
  2. <pre>
  3. <?PHP
  4. $main = new Main();
  5. $second = new Second();
  6.  
  7. class Main{
  8.         function __construct(){
  9.                 print __METHOD__."\n";
  10.         }
  11.        
  12.         function __destruct(){
  13.                 print __METHOD__."\n";
  14.         }
  15.        
  16. }
  17.  
  18. class Second extends Main{
  19.        
  20. }
  21.  

даёт:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. Main::__construct
  3. Main::__construct
  4. Main::__destruct
  5. Main::__destruct
  6.  

где ошибка? в статье или моём понимании?
 
 Top
Champion Супермодератор
Отправлено: 08 Октября, 2011 - 20:26:15
Post Id



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


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


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




Если не переопределны, то вызываются. Но если в дочернем классе написать конструктор (деструктор), то сработает только дочерний. А чтоб дочерний продолжал начатое родительским, - его надо вызвать явно.
(Добавление)
В С++, например, конструкторы срабатывают сами в порядке наследования, и диструкторы - в обратном порядке. А в PHP - не так. Поэтому в статье на это обращается внимание
 
 Top
Быколай
Отправлено: 08 Октября, 2011 - 20:35:32
Post Id



Новичок


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


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




Спасибо Champion!
Просто си не владею, а формулировка в статье наводит на мысль что именно не будет вызова родительских методов автоматом. В случае переопределения конечно и так понятно.
 
 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