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]   

> Без описания
p33t
Отправлено: 29 Декабря, 2014 - 00:31:13
Post Id


Новичок


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


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




Всем привет !!!

Вот вопрос:
Есть класс с подключением, Родитель.
PHP:
скопировать код в буфер обмена
  1.         class Main{
  2.  
  3.                 private static $obj;
  4.                 protected $db_connect;
  5.                
  6.                 private function __construct (){
  7.                                 $link = mysql_connect ('localhost','root','3141592653');
  8.                                 mysql_query("SET NAMES utf8");
  9.                                 mysql_select_db ('test_db', $link) or die ('Can\'t connect:' .mysql_error().'</br>Error #:'. mysql_errno());
  10.                                 $this -> db_connect = $link;
  11.                 }
  12.                
  13.                 protected static function connect(){
  14.                         if (self::$obj === NULL){
  15.                                 self::$obj = new Main();
  16.                                 return self::$obj->db_connect;
  17.                         }
  18.                 }
  19.                 protected function test_method(){
  20.                         echo "test ok";
  21.                 }
  22.                 public function __destruct (){
  23.                                 echo "main destruct";
  24.                 }
  25.         }


К нему подключены два класса
Один дочерний:

PHP:
скопировать код в буфер обмена
  1.  
  2.         class Login extends Main{
  3.        
  4. protected $db_connect;
  5.  
  6.                 public function __construct(){
  7.                         $this->db_connect = parent::connect();
  8.                 }
  9.  
  10. тра-ля-ля методы...
  11.  
  12.                 public function __destruct (){
  13.                         parent::__destruct();
  14.                         echo "child destruct";
  15.                 }
  16.          }
  17.  


и второй дочерний:

PHP:
скопировать код в буфер обмена
  1.  
  2. class Admin extends Main{
  3.        
  4.                 protected $db_connect;
  5.                
  6.                 public function __construct(){
  7.                         $this->db_connect = parent::connect();
  8.                 }
  9.  
  10. Тра-ля-ля методы...
  11. Ну и остальная лабуда...      
  12.  


Функционал - подключение происходит через клсаа Main. Создается обьект статической функцией->конструктором и тд. Если объект создан, то второй не создается.
В конструкторе, подключение используется сначала классом Login, а затем Admin.
В первом из них, все ок.
А вот во второй никак не могу провести коннект.
Я понимаю, что в моем случае, надо unset обьект подключения. Но и это не выходит. Т.к. не могу обратиться ни к одному методу в классе Main. Даже через дочерние классы. Пробовал в test_method - не обращается. Пишет, что не определен Main::test_method.
А деструктор вообще не запускается...

Подскажите что делаю не так ???
 
 Top
esterio
Отправлено: 29 Декабря, 2014 - 01:34:26
Post Id



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


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


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




p33t пишет:
Подскажите что делаю не так ???

все. абсолютно все.
почитайте здесь http://php.net/manual/ru/language.oop5.decon.php
ну и несколько замечаний
конуструктор Main ничего не возвращает (он и не должен) что вы хотите присвоить в $this->db_connect?
p33t пишет:
Если объект создан, то второй не создается.

если вы про синглтон, то у вас никогда не будет екземпляров Admin и Login
плюс включение ошибок вам выведет ошибку при переопределении методов дочерних классов
p33t пишет:
private function __construct (){

p33t пишет:
public function __construct(){

ну и на последок, при создании каждого обьекта у вас будет создаваться коннект с базой а это плохая архитектура
 
 Top
p33t
Отправлено: 29 Декабря, 2014 - 09:30:28
Post Id


Новичок


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


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




esterio пишет:
конуструктор Main ничего не возвращает (он и не должен) что вы хотите присвоить в $this->db_connect?


Ну,, в конструкторе Main класса, в $this->db_connect я запихиваю дескриптор подключения. А возвращает его - стат метод connect.

esterio пишет:
если вы про синглтон, то у вас никогда не будет екземпляров Admin и Login

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

esterio пишет:
плюс включение ошибок вам выведет ошибку при переопределении методов дочерних классов

В этом случае так у меня и получается. Тоже самое, когда обращаюсь к методу который находится в Main

esterio пишет:
ну и на последок, при создании каждого обьекта у вас будет создаваться коннект с базой а это плохая архитектура

Наверно вся идея синглтона в том, чтобы соединение открывалось только один раз...
А в этом случае, при попытке создать еще одно подключение, мне выдает, что "не может переопределить..." Поэтому хотя бы это работает Радость
И вот изза чего я пытаюсь закрыть конект, чтобы открыть его во втором классе.


Ну и вообще, большое спасибо за помощь и ссылку на инфу. Буду изучать, если что вернусь с наболевшим )))

Буду всем признателен за комментарии к этому сообщению...
Еще раз спасибо
 
 Top
esterio
Отправлено: 29 Декабря, 2014 - 11:49:49
Post Id



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


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


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




смотрите если хотите сделать грамотно, то нужно отделять мух от котлет. это означает что вам нужно винести работу с базой в отдельный класс, который при этом может быть синглтоном. а деструктор делать в пыхе не обьязательно. он сам все убьет когда завершит работу (вот где вынос мозга тех кто програмирует на C++ и Java). здесь нужно понимать то, что браузер сделал запросс, пхп отработал и отдал браузеру результат своей работы и вконце умер. вот в момент "умирания" он и чистит всю память, коннекты и прочее сам
 
 Top
p33t
Отправлено: 29 Декабря, 2014 - 16:55:30
Post Id


Новичок


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


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




То есть если грамотно, то мне надо все методы связанные с работой в БД (и подключением конечно же) запихать в один класс ?????
Ну а дальше ?
Сделать производные от него и юзать те, что надо ???

Ну а что до конструктора и деструктора, я все понял...
(Добавление)
Уже который раз убеждаюсь, в том, что все дело либо в мелочах либо в НЕВНИМАТЕЛЬНОСТИ Радость

esterio спасибо здоровенное вам за помощь...

Все разобрался, просто невнимательность, из за которой я потратил 2 дня...
Это мне присуще

Единственно если бы вы могли мне подсказать что может означать эта цифра в скобках:


Это var_dump(); дескриптора подключения.

Неужели у меня 8 подключений одновременно ????
Или это #... , чего ээто # ???)))
 
 Top
esterio
Отправлено: 29 Декабря, 2014 - 17:42:42
Post Id



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


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


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




может быть а может и нет. в ПХП все ресурсы имеют "индекс". каждый новый созданий ресурс инкрементируеться. что у вас за 7 ресурсов перерд этим увы я не знаю (может курл или что-то такое а может и 7 коннектов к БД)
 
 Top
p33t
Отправлено: 29 Декабря, 2014 - 18:04:26
Post Id


Новичок


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


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




Ок.
Как было выше, огромное спасибо за помощь и ваше время.

Проведу рисер4, а там будет видно...

Все, тема закрыта.
 
 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