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]   

> Без описания
3d_killer
Отправлено: 26 Февраля, 2016 - 00:16:36
Post Id



Участник


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


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




Как то я уже задавал похожий вопрос, но ответа кроме как использовать в других классах global $DBH так и не получил, потом долгое время не занимался PHP, но сейчас пришлось заново вернуться и начать изучение ООП, так родилась такая конструкция (сокращенно для примера), хотел поинтересоваться правильно ли я делаю (данная конструкция рабочая)
PHP:
скопировать код в буфер обмена
  1.  
  2. class DB
  3.         {
  4.                 public static $DBH=null;
  5.                 public static function connect_db()
  6.                         {
  7.                                 try
  8.                                         {
  9.                                                 define (PRE_,"");               //Префикс базы данных
  10.                                                 $host="127.0.0.1";              //ХОСТ
  11.                                                 $db="NEW";                              //Имя базы
  12.                                                 $user="root";                   //Логин
  13.                                                 $pass="";                               //Пароль
  14.                                                 //Попытка подключения
  15.                                                 self::$DBH=new PDO(sprintf("mysql:host=%s;dbname=%s", $host, $db), $user, $pass);
  16.                                                 self::$DBH->query("SET NAMES 'utf8'");
  17.                                         }
  18.                                 catch(PDOException $e)
  19.                                         {
  20.                                                 echo " Извините. Но операци не может быть выполнена.";
  21.                                                 die();
  22.                                                 file_put_contents("PDOErrors.txt", $e->getMessage(), FILE_APPEND);
  23.                                         }
  24.                         }
  25.         }
  26. //Создаем подключение
  27. DB::connect_db();
  28.  
  29. class TEST
  30.         {
  31.                 public static function test_dump()
  32.                         {
  33.                                 $STH = DB::$DBH->prepare("SELECT * FROM `PRE_core_constant`");
  34.                                 $STH->execute();
  35.                                 $R=$STH->fetchAll();
  36.                                 var_dump($R);
  37.                         }
  38.         }
  39. //Тест
  40. TEST::test_dump();

(Отредактировано автором: 26 Февраля, 2016 - 00:17:32)

 
My status
 Top
3d_killer
Отправлено: 26 Февраля, 2016 - 00:19:21
Post Id



Участник


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


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




Извиняюсь за такой вид кода, вставляю из notepad++ как тут можно его упорядочить непонятно
Прикреплено изображение (Нажмите для увеличения)
amp174-14.jpg
 
My status
 Top
DelphinPRO
Отправлено: 26 Февраля, 2016 - 09:03:12
Post Id



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


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


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




public fields - это плохо.
как минимум можно сделать метод для получения инстанса PDO

PHP:
скопировать код в буфер обмена
  1. private static $DBH;
  2. public function db() {
  3.   return self::$DBH;
  4. }


можно добавить проверку

PHP:
скопировать код в буфер обмена
  1. /** @return \PDO */
  2. public function db() {
  3.   if (!self::$DBH) {
  4.     throw new \Exception('bla bla');
  5.   }
  6.   return self::$DBH;
  7. }


или сделать "ленивое" подключение

PHP:
скопировать код в буфер обмена
  1. /** @return \PDO */
  2. public function db() {
  3.   if (!self::$DBH) {
  4.     try {
  5.       define (PRE_,"");               //Префикс базы данных
  6.       $host="127.0.0.1";              //ХОСТ
  7.       $db="NEW";                              //Имя базы
  8.       $user="root";                   //Логин
  9.       $pass="";                               //Пароль
  10.       //Попытка подключения
  11.       self::$DBH=new \PDO(sprintf("mysql:host=%s;dbname=%s", $host, $db), $user, $pass);
  12.       self::$DBH->query("SET NAMES 'utf8'");
  13.     } catch(\PDOException $e) {
  14.       echo " Извините. Но операци не может быть выполнена.";
  15.       die();
  16.       file_put_contents("PDOErrors.txt", $e->getMessage(), FILE_APPEND);
  17.     }
  18.   }
  19.   return self::$DBH;
  20. }


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

PHP:
скопировать код в буфер обмена
  1. $STH = DB::db()->prepare("SELECT * FROM `PRE_core_constant`");
  2. $STH->execute();
  3. $R = $STH->fetchAll();


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
3d_killer
Отправлено: 26 Февраля, 2016 - 10:04:27
Post Id



Участник


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


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




спасибо за ответ

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

(Отредактировано автором: 26 Февраля, 2016 - 10:05:37)

 
My status
 Top
DelphinPRO
Отправлено: 26 Февраля, 2016 - 10:38:38
Post Id



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


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


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




Переменную можно презаписать из вне. а метод всегда будет возвращать то что положено.
(Добавление)
Об инкапсуляции слышали? внутренняя реализация должна быть скрыта, а снаружи доступен только публичный API для изменения внутреннего состояния.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
3d_killer
Отправлено: 26 Февраля, 2016 - 10:43:59
Post Id



Участник


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


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




слышал, понял, благодарю
 
My status
 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