Как правильно использование паттерн Singletone?

slego

Новичок
Как правильно использование паттерн Singletone?

Возможно, затрагиваю уже всеми давно замусоленную тему, но поискал по форуму, ответа не нашел :(
Пытаюсь реализовать паттерн Singletone:

PHP:
class Foobar  
{  	
     var $_param;  	

function Foobar($param)  	
{          
     $this->setParam($param);
     echo "constructor<br>";  	
}    	

function &inst()  	
{  		
     static $instance = NULL;  		
     
     if ($instance == NULL)  		
     {          	
            $instance = new Foobar("some_value");  		
     }    		
     return $instance;  	
}   
     
function setParam($param)      
{      	
     $this->_param = $param;      
}    	

function getParam()  	
{      	
     return $this->_param;  	
}  
};    

$obj = Foobar::inst()->getParam();
Строка
PHP:
 $obj = Foobar::inst()->getParam()
по какой-то неведомой мне причине работать отказывается, вываливается ошибка ParseError
Почему я не могу достать значение функции?

Если сделать так
PHP:
$obj = Foobar::inst();
$obj->getParam();
,

то вроде все tres bien. Или я кардинально неправильно пытаюсь все это реализовать? Подскажите, пожалуйста, где ошибка.
Большое спасибо.
 

slego

Новичок
хм... чудово...
Получается в 4-ке Singletone просто не состоялся?
 

slego

Новичок
Хорошо, тогда, возможно, Вы можете подсказать правильный синтаксис?
 

slego

Новичок
где-то я это уже видел... :D
Спасибо.
Еще один вопросик. Насколько некорректно/идеологически неправильно/ерундово и т.д. будет следующий вариант

PHP:
$obj = Foobar::getParam()
Если я, допустим, запишу

PHP:
$obj1 = Foobar::getParam();
$obj2 = Foobar::getParam();
,то будет создано два экземпляра класса Foobar?
 

slego

Новичок
Просто пытаюсь до конца осознать необходимость использования паттерна Singletone.
Вот, допустим, если есть пресловутый класс работы с бд, со своими методами

PHP:
class DB
{
   var $_conn_str;
   function DB($conn_str) 
   {
       //.... устанавливаем соединение с бд
   }
   function execQuery($sql)
   {
       //....
      
   }
   function oneData($sql)
   {
      //...возвращается значение одного поля
      
   }

}
будет ли правильно написать следующее:

PHP:
DB :: DB("mysql:db:root:pass");
$id = DB :: oneData("SELECT id FROM users WHERE user='looser'");

$name = DB :: oneData("SELECT name FROM users WHERE user='looser'");
Будет ли создано одно соединие с бд на весь скрипт БЕЗ использования механизма Singletone? Или (что скорее всего) будут одни сообщения об ошибках? :)

Забегая немного вперед, планирую сдеать следующее:
имею набор классов, которые дружно работают с базой данных. Используя паттерн Singletone, создаю один единственный на весь скрипт экземпляр класса для доступа к бд, который используют все остальные классы.
Вот тольк не пойму, можно ли организовать соединее с базой, путем написания в самом начале скрипта
DB :: DB("mysql:db:root:pass");
 

vitus

мимо проходил
будут одни сообщения об ошибках?
да, при статическом вызове метода невозможно достучаться до нестатического контекста, ругаца будет на
$this->_conn_str, или в качестве $this будет браться не то что планировалось

необходимость синглетона в твоём случае сомнительная.
 

Gas

может по одной?
имею набор классов, которые дружно работают с базой данных. Используя паттерн Singletone, создаю один единственный на весь скрипт экземпляр класса для доступа к бд, который используют все остальные классы.
имхо, нормальное решение.
в конструкторе классов я бы сделал $this->db =& DB :: init("mysql:db:rootass"); и дальше работал с ним.
 

slego

Новичок
Автор оригинала: Gas
имхо, нормальное решение.
в конструкторе классов я бы сделал $this->db =& DB :: init("mysql:db:rootass"); и дальше работал с ним.
Тогда получается, что при создании любого объекта, который использует класс бд, в конструктор нужно передавать строку подключения. Н е х А ч у :) Хотелось бы все-таки в ОДНОМ месте передать строку, подключиться и забыться, т.е. сделать класс глобальным для всех остальных.
 

Gas

может по одной?
slego
ну инициализируй объект где-то в "самом начале" с коннекшеном, а потом вызывай init без параметров. Если объект не создан и нет параметров подключения вызывай trigger_error, иначе return $instance.
Может решение и не из лучших, тогда поправьте.

но необходимости наверное всётаки нету
да нету, главное желание :)
 

slego

Новичок
Автор оригинала: Gas
slego
ну инициализируй объект где-то в "самом начале" с коннекшеном
ВОТ! Вот, что я и хочу узнать. КАК его правильно инициализировать? Конструкция
DB :: DB("mysql:db:root : pass");

есть хорошо?
 

Gas

может по одной?
Ты его должен инициалировать в том-же методе, в котором ты его потом возвращать будешь. В php4 нет статических свойст классов.
Или пусть конструктор этого класса сам достанет параметры для подключения из настроек.
 

vitus

мимо проходил
и увидел Он что это хорошо, и сказал: да будет так.
и была ночь и было утро ...

-~{}~ 28.02.05 18:29:

это я к тому, что за тебя никто не решит
 

slego

Новичок
Всем большое спасибо за помощь и уделенное внимание. Информацию к размышлению принял, буду пробовать. Еще раз спасибо.
 
Сверху