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


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

> Без описания
koras
Отправлено: 02 Октября, 2011 - 15:28:27
Post Id



Частый гость


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


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




Есть класс

PHP:
скопировать код в буфер обмена
  1.        
  2.  
  3. class DB {
  4.         var $login = "";
  5.         var $pass = "";
  6.         var $dbase = "";
  7.         var $server = '';
  8.  
  9.         public function connect() {
  10.                 $this->conn = mysql_connect($this->server, $this->login, $this->pass) or die(mysql_error());
  11.                 mysql_select_db($this->dbase) or die(mysql_error());
  12.                 mysql_query('SET character_set_database = utf8');
  13.                 mysql_query('SET NAMES utf8');
  14.         }
  15.  
  16.        
  17.         public function query($query) {
  18.                  
  19.                 $this->result = mysql_query ( $query, $this->conn );
  20.                
  21.                 if ($this->result)
  22.                         return $this->result;
  23.         }
  24.  
  25. }
  26.  
  27. # дочерний класс
  28.  
  29. class NEWS extends  DB {
  30.         var $select,$data;
  31.          
  32.         public function latest_news() {
  33.                 $this -> select = "SELECT * FROM  news where news.activ = '1'  LIMIT 0,5;";
  34.                 $this -> data = $this->query($this -> select);
  35.                 while ($while_fire = mysql_fetch_assoc($this -> data)) {
  36.                          $datas[] = $while_fire;
  37.                 }
  38.         return  $datas;
  39.         }
  40. }
  41.        


не могу с дочернего класса получить результаты родителя, Если не из дочернего обращаться то всё тип топ, но мне надо именно из дочернего

(Отредактировано автором: 02 Октября, 2011 - 15:29:51)

 
 Top
OrmaJever Модератор
Отправлено: 02 Октября, 2011 - 15:54:21
Post Id



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


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


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




в наследнике вы вызываете только $this->query(), а перед ним ещё должно быть подключение.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
koras
Отправлено: 02 Октября, 2011 - 16:08:30
Post Id



Частый гость


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


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




Не понимаю,
Дальше по коду я объявляю класс, скажем так

PHP:
скопировать код в буфер обмена
  1.  
  2. $obj = new NEWS();
  3. $obj ->latest_news();
  4.  

Но должным образом не работает.
Что неправильно, подскажите?

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

 
 Top
OrmaJever Модератор
Отправлено: 02 Октября, 2011 - 16:32:40
Post Id



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


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


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




ну вот вы вызываете метод latest_news, он вызывает query, а в query требуется подключение
koras пишет:
$this->result = mysql_query ( $query, $this->conn );

Откуда должно взятся $this->conn ? Где подключение? Куда посылать запрос? В рельсу?
Должно быть так
PHP:
скопировать код в буфер обмена
  1. $obj = new NEWS();
  2. $obj->connect(/* ... */);
  3. $obj ->latest_news();


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Мелкий Супермодератор
Отправлено: 02 Октября, 2011 - 16:36:47
Post Id



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


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


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




Неправильна вся идея наследовать класс DB для конкретного запроса. Используйте, например, паттерн singleton.


-----
PostgreSQL DBA
 
 Top
koras
Отправлено: 02 Октября, 2011 - 16:56:27
Post Id



Частый гость


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


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




OrmaJever Вы правы, спасибо большое.
Понял свою ошибку.

Мелкий Можно конкретней.
Про паттерн singleton я читал, но сути не понял, то есть зачем это надо или для чего.


По идее класс db неправильный, не могу понять почему.

Предварительно я создаю обект класса db и работаю с ним, то есть он достаточно большой. но и решил его наследовать чтоб расширить его функционал в классе news и получается что при наследовании, когда коннект к базе был открыт раньше и делались запросы, он как бы закрывается.


то есть
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3.  
  4.  
  5. class DB {
  6.         var $login = "";
  7.         var $pass = "";
  8.         var $dbase = "";
  9.         var $server = '';
  10.  
  11.         public function connect() {
  12.                 $this->conn = mysql_connect($this->server, $this->login, $this->pass) or die(mysql_error());
  13.                 mysql_select_db($this->dbase) or die(mysql_error());
  14.                 mysql_query('SET character_set_database = utf8');
  15.                 mysql_query('SET NAMES utf8');
  16.         }
  17.  
  18.        
  19.         public function query($query) {
  20.                  
  21.                 $this->result = mysql_query ( $query, $this->conn );
  22.                
  23.                 if ($this->result)
  24.                         return $this->result;
  25.         }
  26.  
  27. }
  28.  
  29.  
  30.  
  31.  
  32. # дочерний класс
  33.  
  34. class NEWS extends  DB {
  35.         var $select,$data;
  36.          
  37.         public function latest_news() {
  38.                 $this -> select = "SELECT * FROM  news where news.activ = '1'  LIMIT 0,5;";
  39.                    $this->connect();//решение проблемы
  40.                 $this -> data = $this->query($this -> select);
  41.                 while ($while_fire = mysql_fetch_assoc($this -> data)) {
  42.                          $datas[] = $while_fire;
  43.                 }
  44.         return  $datas;
  45.         }
  46. }
  47.  
  48.  
  49.  
  50. $obj1 = new DB();
  51. $base -> connect();
  52.  
  53. // здесь мой код трололо
  54.  
  55. $base -> query("select * from table"); // etc
  56. // ....
  57.  
  58.  
  59. // вызываем дочерний класс
  60.  
  61. $obj2 = new NEWS();
  62. $obj2  ->latest_news() ;// коннекта к базе нет, но мы в классе прописываем  $this->connect();
  63.  
  64.  
  65.  

(Отредактировано автором: 02 Октября, 2011 - 17:08:10)

 
 Top
Мелкий Супермодератор
Отправлено: 02 Октября, 2011 - 17:17:29
Post Id



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


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


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




koras пишет:
По идее класс db неправильный, не могу понять почему.

Потому что уже в приведённом фрагменте устанавливается 2 соединения с базой. Второе при том - совершенно бессмысленно тратит ресурсы.

koras пишет:
Про паттерн singleton я читал, но сути не понял, то есть зачем это надо или для чего.

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

Делается соединение с базой-singleton с минимально-необходимым функционалом. Лучше сделать ещё класс для результата.
А когда нужны конкретные запросы уже - делается класс модели, news для этого случая, там уже получается экземпляр DB (а не наследуется!) и делает запрос.


-----
PostgreSQL DBA
 
 Top
koras
Отправлено: 02 Октября, 2011 - 17:55:13
Post Id



Частый гость


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


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




У меня класс DB достаточно большой, там различный вывод query и так далее и разделять его как бы не логично. но если разделять то получиться вот что.

PHP:
скопировать код в буфер обмена
  1. class DB{
  2. public function connect() {
  3. // коннектимся к базе
  4. }
  5. }
  6.  
  7. class SqlQuery extends  DB {
  8.  
  9. // отправляем запрос к базе
  10. public function queryt() {
  11.  $this->connect();
  12. mysql_query("select *");
  13. }
  14.  
  15. // получаем ассоциативный массив
  16. public function getAssoc($result) {
  17.                 $res = array ();
  18.                 while ( $row = mysql_fetch_assoc ( $result ) )
  19.                         $res [] = $row;
  20.                 return $res;
  21.                
  22.         }
  23. // ну и так далее
  24. }
  25.  
  26. class NEWS extends  SqlQuery {
  27.         var $select,$data;
  28.          
  29.         public function latest_news() {
  30.                 $this -> select = "SELECT * FROM  news where news.activ = '1'  LIMIT 0,5;";
  31.                    $this->connect();//решение проблемы
  32.                 $this -> data = $this->query($this -> select);
  33.                 while ($while_fire = mysql_fetch_assoc($this -> data)) {
  34.                          $datas[] = $while_fire;
  35.                 }
  36.         return  $datas;
  37.         }
  38. }
  39.  
  40.  
  41.  



2 класса которые наследуют класс DB и в которых коннект оборвется и везде надо подключатся к базе заново.
Как решить такую проблему ?
 
 Top
OrmaJever Модератор
Отправлено: 02 Октября, 2011 - 18:29:29
Post Id



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


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


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




мне кажется тут наслодование не нужно.
первый класс DB (возможно сингтоном) в котором все действия с базой
PHP:
скопировать код в буфер обмена
  1. class DB{
  2. public function connect() {}
  3. public function query() {}
  4. public function fetch_array() {}
  5. public static function getObj() {} // метод синглтона
  6. // и т.д
  7. }
  8. // и второй класс
  9.  
  10. class NEWS {
  11.      public function latest_news() {
  12.            $db = DB::getObj(); // ну тут ещё нужно проверить на подключение и т.д
  13.            $db->query();
  14.      }
  15. }
  16.  


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
koras
Отправлено: 02 Октября, 2011 - 19:52:39
Post Id



Частый гость


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


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




PHP:
скопировать код в буфер обмена
  1. public static function getObj() {} // метод синглтона
  2.  


А здесь что должно быть, какие действия ?
Все действия с базой выше.
 
 Top
OrmaJever Модератор
Отправлено: 02 Октября, 2011 - 20:03:09
Post Id



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


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


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






-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
caballero
Отправлено: 02 Октября, 2011 - 22:08:03
Post Id


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


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


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




синглетоном нужно делать только коннект к базе
запросы нужно выполнять там где соответствующая бизнес лгика


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
koras
Отправлено: 02 Октября, 2011 - 22:38:50
Post Id



Частый гость


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


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




Тогда правильней будет так

PHP:
скопировать код в буфер обмена
  1.  
  2.     class DB{
  3.     public function connect() {}// метод синглтона
  4.     }
  5.     // и второй класс
  6.      
  7.     class NEWS {
  8.     public function query() {
  9.          $db = DB::getObj(); // ну тут ещё нужно проверить на подключение и т.д
  10.            $db->query();
  11. }
  12.     public function fetch_array() {}
  13.     public static function getObj() {}  
  14.     // и т.д
  15.          public function latest_news() {
  16.  
  17.          }
  18.     }

(Отредактировано автором: 02 Октября, 2011 - 22:39:48)

 
 Top
caballero
Отправлено: 02 Октября, 2011 - 22:48:39
Post Id


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


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


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




public static function getObj()

а что это делает во втором классе


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
OrmaJever Модератор
Отправлено: 02 Октября, 2011 - 23:58:36
Post Id



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


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


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




koras всётаки вы не поняли всей идеи
Вот решил уже потратить время и обьяснить
PHP:
скопировать код в буфер обмена
  1. class db {
  2.         private $handle = false;
  3.         private static $obj = null;
  4.        
  5.         private $host = 'localhost';
  6.         private $login = 'root';
  7.         private $pass = 'password';
  8.         private $db = 'database';
  9.        
  10.         public function __construct() {}
  11.         public function __destruct() { if($this->handle) mysql_close($this->handle); }  // если подключение открыто - закрываем
  12.         public function __clone() {die('нельзя клонировать обьект');} // запрещаем копии обьекта
  13.         public static function getObj() {
  14.                 if(is_null(self::$obj)) {  // если ещё нету обьекта (он ещё не где не создавался)
  15.                         self::$obj = new self;     // то создаёт и записываем
  16.                 }
  17.                 return self::$obj;            // если оюбьект был создан то условие пропускается и сразу возвращает
  18.         }
  19.         public function connect() {
  20.                 if(!$this->handle)  {
  21.                         $this->handle = mysql_connect($this->host, $this->login, $this->pass);  // если подключения ещё небыло то подключаемся и пишем ресурс в переменую
  22.                         mysql_select_db($this->db, $this->handle);
  23.                 } else return;   // если подключение было то просто пропускаем функцию
  24.         }
  25.         public function query($query) {
  26.                 if(!$this->handle) $this->connect();
  27.                 mysql_query($query, $this->handle);
  28.         }
  29.         // остальные методы    
  30. }
  31.  
  32. class news {
  33.         public function query() {
  34.                 $db = db::getObj();
  35.                 $db->query(/* ... */); 
  36.         }
  37.         // ну и дальше я не знаю какие методы должны быть в этом классе
  38. }


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB