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]   

> Без описания
Rooner
Отправлено: 01 Апреля, 2012 - 15:59:15
Post Id


Посетитель


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


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




Как в дочернем классе получить переменную из родительского класса, если дочерний класс создается в конструкторе родительского класса?
Вот простой пример, в котором на мой взгляд должна выводиться переменная $test, а на самом деле не выводится.
PHP:
скопировать код в буфер обмена
  1.   class MyParent {
  2.    
  3.     public $test;
  4.     protected $obj;
  5.    
  6.     function __construct() {
  7.       $this->test = "Содержимое test";
  8.       $this->obj = new MyChild();
  9.     }
  10.     function getTest() {
  11.       return $this->test;
  12.     }
  13.   }
  14.   class MyChild extends MyParent {
  15.    
  16.     function __construct() {
  17.       echo MyParent::getTest();
  18.     }
  19.   }
  20.   $parent = new MyParent();


Как вариант можно конечно передать переменную при создании дочернего класса
$this->obj = new MyChild($this->test);
Но если еременных и дочерних классов много, то замучаешься передавать, да и смысл в extends теряется.

(Отредактировано автором: 01 Апреля, 2012 - 16:03:23)

 
 Top
caballero
Отправлено: 01 Апреля, 2012 - 16:53:25
Post Id


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


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


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




Цитата:
Как в дочернем классе получить переменную из родительского класса, если дочерний класс создается в конструкторе родительского класса?

а что делать дочернему классу в конструкторе родительского?
может хоть почитаешь основы ООП прежде чем городить такую лабуду


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DelphinPRO
Отправлено: 01 Апреля, 2012 - 17:09:41
Post Id



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


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


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




PHP:
скопировать код в буфер обмена
  1. class MyParent {
  2.     public $test;
  3.  
  4.     function __construct() {
  5.         $this->test = "Содержимое test";
  6.     }
  7.  
  8.     function getTest() {
  9.         return $this->test;
  10.     }
  11.   }
  12.  
  13. class MyChild extends MyParent {
  14.  
  15. }
  16.  
  17. $child = new MyChild();
  18. echo $child->getTest(); // "Содержимое test"


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Rooner
Отправлено: 01 Апреля, 2012 - 18:21:57
Post Id


Посетитель


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


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




caballero пишет:
а что делать дочернему классу в конструкторе родительского?
может хоть почитаешь основы ООП прежде чем городить такую лабуду

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

DelphinPRO, не подходит такая запись.

Пока просто передал данные в виде массива в дочерний класс.
 
 Top
OrmaJever Модератор
Отправлено: 01 Апреля, 2012 - 18:28:24
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Rooner У вас не правельная структура класов значит. Родительский класс должен быть класом не зависящим от других, а дочерние уже расширять этот функционал.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Bio man
Отправлено: 01 Апреля, 2012 - 21:17:36
Post Id


Постоянный участник


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


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




Rooner пишет:
это нужно для моей задачи
А кто тебе задачу дал? Сам придумал? Препод? Друг?
(Добавление)
Во первых в конструкторе MyChild нужно вызвать конструктор родителя. Но если это сделать то будет зацикливание.
(Добавление)
либо сделать свойство с текстом статическим.
PHP:
скопировать код в буфер обмена
  1. class MyParent {
  2.    
  3.     public static $test;
  4.     protected $obj;
  5.         protected static $b = false;
  6.    
  7.     function __construct() {
  8.         self::$test = "Содержимое test";
  9.                 $this->obj = new MyChild();
  10.     }
  11.     function getTest() {
  12.       return self::$test;
  13.     }
  14. }
  15. class MyChild extends MyParent {
  16.    
  17.     function __construct() {
  18.       echo $this->getTest();
  19.     }
  20. }
  21. $parent = new MyParent();

(Отредактировано автором: 01 Апреля, 2012 - 22:10:31)

 
 Top
p33t
Отправлено: 18 Октября, 2014 - 08:52:10
Post Id


Новичок


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


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




Всем привет.
Тема довольно старая, но тем не менее может кто то ответит.

Вопрос похожего характера.

Есть класс main и 2 дочерних от него index и search
PHP:
скопировать код в буфер обмена
  1.  
  2. class Main{
  3.        
  4.                 protected $db_connect;
  5.                 protected static $start = NULL;
  6.                
  7.                 protected function __construct (){
  8.                         $link = mysql_connect ('localhost','root','3141592653');
  9.                         mysql_select_db ('test_db', $link) or die ("can't connect");
  10.                         $this -> db_connect = $link;
  11.                 }
  12.                
  13.                 protected function mkObj(){
  14.                         if (self::$start===NULL){self::$start = new Index();}
  15.                                 return self::$start;
  16.                         }
  17.                        
  18.                 protected function get_connect (){
  19.                         return $this->db_connect;
  20.                 }
  21.                
  22.         }
  23.  


Main он просто для создания подключения.

PHP:
скопировать код в буфер обмена
  1. require_once "class_Main.php";
  2.  
  3.         class Index Extends Main{
  4.        
  5.                 public static function indexObj(){
  6.                         return parent::mkObj();
  7.                 }
  8.        
  9.  



PHP:
скопировать код в буфер обмена
  1. require_once "class_Main.php";
  2.  
  3. class Search Extends Main {
  4.  
  5.         public function __construct ($key, $index){
  6.                 //echo $this->search ($key, $index);
  7.                 //parent::__construct();
  8.                 $connect = $this->db_connect;
  9.                 echo var_dump($connect);
  10.         }


Так вот, из класса index я могу получить $db_connect в которой содержится "подключение" БЕЗ вызова конструктора родителя. И все прекрасно работает.
Но в классе Search, если не запрашивать конструктор родителя, $db_connect взять из родителя не получается.

Почему так?
в одном классе можно, в другом нет.
 
 Top
MiksIr
Отправлено: 18 Октября, 2014 - 15:02:27
Post Id


Забанен


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


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

[+]


Цитата:
БЕЗ вызова конструктора родителя.

Потому что с вызовом. Дочерние классы наследуют все родительские методы, если те не private.
Во втором случае вы переопределили конструктор - а значит выполняется он, а не родительский.


-----
self-banned
 
 Top
p33t
Отправлено: 19 Октября, 2014 - 20:24:19
Post Id


Новичок


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


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




MiksIr прежде всего Спасибо вам за ответ.

На сколько я понял, если в дочернем классе вообще не будет конструктора, тогда при создании объекта дочернего класса, будет запущен конструктор родителя.
Верно ?

Наверно это и произошло в моем классе Index.

Но я пробовал так же убрать конструктор из класса search. При обращении в свойству содержащем подключение ($db_connect), мне возвращало null.
 
 Top
MiksIr
Отправлено: 19 Октября, 2014 - 22:35:05
Post Id


Забанен


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


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

[+]


p33t пишет:
На сколько я понял, если в дочернем классе вообще не будет конструктора, тогда при создании объекта дочернего класса, будет запущен конструктор родителя.
Верно ?

Да, все точно также, как если бы вызывали метод __construct из объекта сами.

p33t пишет:
Но я пробовал так же убрать конструктор из класса search. При обращении в свойству содержащем подключение ($db_connect), мне возвращало null.

Если бы все правильно убрали, то проблем быть не должно. Единственное, что в голову приходит - это что в классе search есть метод search. Наследие пхп4 - метод с именем таким же как класс - работает как конструктор.
(Добавление)
ЗЫ: и конструктор делайте public


-----
self-banned
 
 Top
p33t
Отправлено: 20 Октября, 2014 - 20:55:19
Post Id


Новичок


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


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




Радость
Да, спасибо.
Так и сделал, да и еще много чего поменял.

Если можно, вопрос не по теме...

Вот небольшой кодик:
Учерен вам будет понятно что он делает.
вот только не могу понять чего он не работает
То есть обходит мимо конструкцию if игнорируя ее вообще и выдает все что есть в массиве даже пустые поля.

Что я делаю не так ?

PHP:
скопировать код в буфер обмена
  1.  
  2. <table>
  3.                                 <?PHP foreach($prof_data as $value){?>
  4.                                         <?PHP if ($value==""){
  5.                                                 continue;
  6.                                         }?>
  7.                                         <tr>
  8.                                                 <td><?PHP echo $value; ?></td>
  9.                                         </tr>
  10.                                         <?PHP ;} ?>
  11.                         </table>
  12.  
 
 Top
MiksIr
Отправлено: 20 Октября, 2014 - 21:01:55
Post Id


Забанен


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


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

[+]


Код работает правильно. Ищите ошибку в другом месте.


-----
self-banned
 
 Top
p33t
Отправлено: 20 Октября, 2014 - 21:50:40
Post Id


Новичок


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


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




С вопросом что выше я разобрался Радость
(Добавление)
Спасибо за помощ
(Добавление)
Дело было в массиве который передавал значение "пробел пробел"
А и не задумываясь что такое может быть вставлял только 1 пробел.
На таких глупостях стопорится дело дольше всего
Радость
 
 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