Смысл немного в другом - в C++ преодолевается разделение глобальных переменных модулей.а смысл синглтона в том, что не надо тащить за собой на протяжении всего скрипта глобальную переменную (ссылку на объект или connection resource).
да не придётся, в любом месте я вызову class::instance() и получу ссылку на объектАвтор оригинала: Pigmeich
И тащить ссылку тебе всё равно придётся - в виде класса синглтона.
И че в каждой функции открывать новое подключение и закрывать его ?Автор оригинала: Pigmeich
Ещё раз, в большинстве мест достаточно создать подключение, сделать запрос, получить результат и закрыть подключение. И, обычно, это умещается в одну функцию.
Ога. А потом когда приходится заниматься поддержкой подобных проектов начинаешь ловить непонятки - чего откуда взялось/где глюки происходят/где тормоза скрипт ловит.Автор оригинала: Pigmeich
Ещё раз, в большинстве мест достаточно создать подключение, сделать запрос, получить результат и закрыть подключение. И, обычно, это умещается в одну функцию.
В случае работы с несколькими подключениями - надо делать фабрику. Фабрика вызывает класс-адаптер и реализует Interface IDB. Данный класс вызывает в зависимости от типа БД, соответствующий класс MySQLDB или MySQLi или PgSQL, в зависимости от необходимости.В случае подключения к нескольким базам: обертка работает с несколькими синглтонами подключений
$fdb = new FactoryDB;
$cnn1= $fdb->Create( 'MySQL', 'cnn params' );
$cnn2 = $fdb->Create( 'PgSQL', 'cnn params' );
... [ any class]
$db = FactoryDB::getInstance();
$db->Query( $sql1, $cnn1 ); $res1= $db->FetchObject($cnn1); // первый рекордсет
$db->Query( $sql2, $cnn2 ); $res2= $db->FetchObject($cnn2); // второй рекордсет
Немного другое имел ввиду. Извиняюсь за много строк, но пример рабочий и четко передает суть.Автор оригинала: Alexandre
В случае работы с несколькими подключениями - надо делать фабрику.
<?php
class MultiDBInterface
{
public static function query($sql, $cnn = 'con1')
{
global $multi_db_obj;
$multi_db_obj->query($sql, $cnn);
}
}
class MultiDB
{
private $connections;
private $info = array('con1' => 'DbFirst', 'con2' => 'DbSecond');
public function query($sql, $cnn)
{
if (empty($this->connections[$cnn])) $this->openConnect($cnn);
$this->connections[$cnn]->doQuery($sql);
}
private function openConnect($cnn)
{
eval('$this->connections[$cnn] = ' . $this->info[$cnn] . '::create();');
}
}
class DbFirst
{
private function __construct()
{
// собственно открываем соединение
}
public static function create()
{
return new DbFirst();
}
public function doQuery($sql)
{
echo '<br> ' . $sql;
}
}
class DbSecond
{
private function __construct()
{
// собственно открываем соединение
}
public static function create()
{
return new DbSecond();
}
public function doQuery($sql)
{
echo '<br> ' . strtoupper($sql);
}
}
$multi_db_obj = new MultiDB();
$multi_db_obj->query('qwe', 'con2');
class INeedSomeDibies
{
public function need()
{
MultiDBInterface::query('qweqweqweqweqwe');
}
}
$q = new INeedSomeDibies();
$q->need();
?>
Не тоже самое. Учим матчасть.$db= DB1::getInstance(); // идиотский способ сделать то же самое
DB::connect($dbHost,$dbUser,$dbPass,$dbName,"connection_name");
DB::connect($dbHost,$dbUser,$dbPass,$dbName,"connection_name2");
//Если требуется коннект, который делается первым, либо выставленный по-дефолту
DB::query("SELECT blablabla...");
//если требуется ко второму
DB::query("SELECT blablabla...","connection_name2");
class Context {
function getDbConn()
{
return $this->db_conn;
}
function setDbConn($value)
{
$this->db_conn = $value;
}
}
Только если количество одновременных запросов меньше лимитаАвтор оригинала: Pigmeich
cDLEON
Я считаю, что лучше коннектиться на месте персистентом через PDO.
Потому что хочется быть уверенным, что он ОДИН.Но если кому неймется держать где-то в глобальной области коннект (неважно в каком виде), то зачем именно синглетон непонятно. (Хотя вы можете просмотреть на верх и найти в моем посте как бы ответ на этот вопрос).
К PDO отношусь Положительно. Но все равно приходится писать собственные обертки, если работаешь на публику, PDO может быть не везде установленно.Фактически, фабрика и абстрактный интерфейс реализованны в PDO. Как к ни относишься?