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 :: Не хочет работать Singleton

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
kappa
Отправлено: 04 Февраля, 2012 - 10:41:53
Post Id



Посетитель


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


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




Доброго дня. Подскажите, почему не хочет работать паттерн Singleton ?

CODE (htmlphp):
скопировать код в буфер обмена
  1. class Db {
  2.    
  3.     const DB_NAME = 'test.db';
  4.     private $_db;
  5.     private static $instance;
  6.     private function __construct() {
  7.         $this->_db = new SQLite3(self::DB_NAME);
  8.        
  9.     }
  10.    
  11.     private function __clone() {}
  12.     public static function getInstance() {
  13.         if(empty(self::$instance)) {
  14.             self::$instance = new Db();
  15.         }
  16.         return self::$instance;
  17.     }
  18.    
  19. }


Пробовал вызывать

$db = new Db();

или так: Db::getInstance();

Но не хочет работать с БД никак. Что же не так ?!
 
 Top
sKaa
Отправлено: 04 Февраля, 2012 - 10:52:50
Post Id



Частый посетитель


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


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

[+]


PHP:
скопировать код в буфер обмена
  1. class Db {
  2.         private function __construct() {}
  3.         private function __wakeup() {}
  4.         private function __clone() {}
  5.        
  6.         private static $instance = NULL;
  7.  
  8.         const DB_NAME = 'test.db';
  9.        
  10.         public static function getInstance() {
  11.             if(is_null(self::$instance)) {
  12.                 self::$instance = new SQLite3(self::DB_NAME);
  13.             }
  14.             return self::$instance;
  15.         }
  16.        
  17.     }

(Добавление)
Ты че-то там понагородил, разбираться надо. Мой пример просто без лишней херни.

(Отредактировано автором: 04 Февраля, 2012 - 10:53:04)

 
 Top
kappa
Отправлено: 04 Февраля, 2012 - 11:10:53
Post Id



Посетитель


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


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




У меня сделано чтобы можно было вызывать при объявлении объекта и через статистический метод.
sKaa

Спасибо, вроде как все правильно, но не работает, я даже сам не пойму почему.
Вызываю так
CODE (htmlphp):
скопировать код в буфер обмена
  1. $db = Db::getInstance(); // но не работает ::unsure.gif::


А вот когда просто так делаю для проверки то все работает.
CODE (htmlphp):
скопировать код в буфер обмена
  1. class Db {
  2.    
  3.     const DB_NAME = "test.db";
  4.     public $_db;
  5.    
  6.     function __construct() {
  7.         $this->_db = new SQLite3(self::DB_NAME);
  8.     }
  9.    
  10. }
 
 Top
sKaa
Отправлено: 04 Февраля, 2012 - 11:20:32
Post Id



Частый посетитель


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


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

[+]


$db = db::getInstance();
var_dump($db);
 
 Top
kappa
Отправлено: 04 Февраля, 2012 - 11:27:19
Post Id



Посетитель


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


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




Выдает такое:
object(SQLite3)#1 (0) { }

В рабочем варианте:
object(Db)#1 (1) { ["_db"]=> object(SQLite3)#2 (0) { }

(Отредактировано автором: 04 Февраля, 2012 - 11:30:59)

 
 Top
sKaa
Отправлено: 04 Февраля, 2012 - 11:43:56
Post Id



Частый посетитель


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


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

[+]


PHP:
скопировать код в буфер обмена
  1. Ну всё работает.
  2. db::getInstance()->select('...');
  3. [i](Добавление)[/i]
  4. Ну или попробуй конструкцию :
  5. try {
  6.   $sql = db::getInstance();
  7.   if(sqlite_last_error($sql)){
  8.     throw new Exception(sqlite_error_string (sqlite_last_error($sql)));
  9.   }
  10. } catch (Exception $e){
  11.   echo $e->getMessage();
  12. }

(Отредактировано автором: 04 Февраля, 2012 - 11:48:52)

 
 Top
kappa
Отправлено: 04 Февраля, 2012 - 12:05:53
Post Id



Посетитель


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


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




Ура!!!
Спасибо,все заработало.

CODE (htmlphp):
скопировать код в буфер обмена
  1. try {
  2.   $sql = Db::getInstance();
  3.   $res = $sql->querySingle("SELECT * FROM users WHERE id=2", TRUE);
  4.   var_dump($res);
  5.   if(sqlite_last_error($sql)){
  6.     throw new Exception(sqlite_error_string (sqlite_last_error($sql)));
  7.   }
  8. } catch (Exception $e){
  9.   echo $e->getMessage();
  10. }


Щас буду разбираться почему же не работало.
 
 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