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

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

1. kappa - 04 Февраля, 2012 - 10:41:53 - перейти к сообщению
Доброго дня. Подскажите, почему не хочет работать паттерн 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();

Но не хочет работать с БД никак. Что же не так ?!
2. sKaa - 04 Февраля, 2012 - 10:52:50 - перейти к сообщению
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.     }

(Добавление)
Ты че-то там понагородил, разбираться надо. Мой пример просто без лишней херни.
3. kappa - 04 Февраля, 2012 - 11:10:53 - перейти к сообщению
У меня сделано чтобы можно было вызывать при объявлении объекта и через статистический метод.
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. }
4. sKaa - 04 Февраля, 2012 - 11:20:32 - перейти к сообщению
$db = db::getInstance();
var_dump($db);
5. kappa - 04 Февраля, 2012 - 11:27:19 - перейти к сообщению
Выдает такое:
object(SQLite3)#1 (0) { }

В рабочем варианте:
object(Db)#1 (1) { ["_db"]=> object(SQLite3)#2 (0) { }
6. sKaa - 04 Февраля, 2012 - 11:43:56 - перейти к сообщению
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. }
7. kappa - 04 Февраля, 2012 - 12:05:53 - перейти к сообщению
Ура!!!
Спасибо,все заработало.

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. }


Щас буду разбираться почему же не работало.

 

Powered by ExBB FM 1.0 RC1