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
Форумы портала PHP.SU :: Версия для печати :: Подключение к базе данных в классе с глобальной переменной
Форумы портала PHP.SU » » Объектно-ориентированное программирование » Подключение к базе данных в классе с глобальной переменной

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

1. 3d_killer - 26 Февраля, 2016 - 00:16:36 - перейти к сообщению
Как то я уже задавал похожий вопрос, но ответа кроме как использовать в других классах 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();
2. 3d_killer - 26 Февраля, 2016 - 00:19:21 - перейти к сообщению
Извиняюсь за такой вид кода, вставляю из notepad++ как тут можно его упорядочить непонятно
3. DelphinPRO - 26 Февраля, 2016 - 09:03:12 - перейти к сообщению
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();
4. 3d_killer - 26 Февраля, 2016 - 10:04:27 - перейти к сообщению
спасибо за ответ

но не могу понят почему публичная переменная плохо а публичный метод хорошо?
в плане того что можно добавить исключение?
5. DelphinPRO - 26 Февраля, 2016 - 10:38:38 - перейти к сообщению
Переменную можно презаписать из вне. а метод всегда будет возвращать то что положено.
(Добавление)
Об инкапсуляции слышали? внутренняя реализация должна быть скрыта, а снаружи доступен только публичный API для изменения внутреннего состояния.
6. 3d_killer - 26 Февраля, 2016 - 10:43:59 - перейти к сообщению
слышал, понял, благодарю

 

Powered by ExBB FM 1.0 RC1