camka
не самка
Проблема закрытия соединения с базой (PDO) через Singleton
Удивило, что в PDO отсутствует непосредственный метод закрытия соединения. Отсутствует также и деструктор, который можно было бы явно вызвать, чтобы отсоединиться. Закрывается соединение лишь присваиванием объекту PDO значения NULL. Из-за этого не могу закрыть соединение, порожденное шаблоном Singleton.
Поскольку ссылка на объект существует в статической переменной класса, то объект продолжает существовать, а с ним и соединение.
Аналогично нельзя закрыть соединение, непосредственно вызвав метод класса db и присвоив переменной $inst значение NULL, поскольку внешняя переменная $dbh все еще существует.
Можно возвращать ссылку на объект из метода db::get(), (function &get()), но тогда придется каждый раз при вызове этого метода использовать синтаксис присваивания по ссылке $dbh =& db::get(), а это может породить трудно отлавливаемые ошибки, если кто-то где-то упустит знак амперсанда.
Пробовал передавать переменную в метод db::get() параметром по ссылке (function get(&$dbh)) и там присваивать тоже по ссылке ей объект соединения. Но в итоге переменная приходит обратно со значением NULL.
Удивило, что в PDO отсутствует непосредственный метод закрытия соединения. Отсутствует также и деструктор, который можно было бы явно вызвать, чтобы отсоединиться. Закрывается соединение лишь присваиванием объекту PDO значения NULL. Из-за этого не могу закрыть соединение, порожденное шаблоном Singleton.
PHP:
define('DSN', 'pgsql:host=127.0.0.1;dbname=*******');
class db {
protected static $inst;
public static function get()
{
if (is_null(self::$inst))
self::$inst = new PDO(DSN);
return self::$inst;
}
}
$dbh = db::get();
$dbh = null; // соединение не закрывается
Аналогично нельзя закрыть соединение, непосредственно вызвав метод класса db и присвоив переменной $inst значение NULL, поскольку внешняя переменная $dbh все еще существует.
Можно возвращать ссылку на объект из метода db::get(), (function &get()), но тогда придется каждый раз при вызове этого метода использовать синтаксис присваивания по ссылке $dbh =& db::get(), а это может породить трудно отлавливаемые ошибки, если кто-то где-то упустит знак амперсанда.
Пробовал передавать переменную в метод db::get() параметром по ссылке (function get(&$dbh)) и там присваивать тоже по ссылке ей объект соединения. Но в итоге переменная приходит обратно со значением NULL.
PHP:
define('DSN', 'pgsql:host=127.0.0.1;dbname=*************');
class db {
protected static $inst;
public static function get(&$dbh)
{
if (is_null(self::$inst))
self::$inst = new PDO(DSN);
$dbh =& self::$inst;
}
}
$dbh = null;
db::get($dbh);
var_dump($dbh); // NULL