Проблема закрытия соединения с базой (PDO) через Singleton

camka

не самка
Проблема закрытия соединения с базой (PDO) через Singleton

Удивило, что в 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
 

tf

крылья рулят
[долго много думал]
и правильно, ссылка до сих пор существует в статическом классе
 

camka

не самка
Вопрос 1: Почему последний описаный вариант оставляет значение NULL в переменной, несмотря на то, что объект ей присваевается, и передается она по ссылке.

Вопрос 2: Возможно, кто-то знает объяснение тому факту, что в PDO отсутствует метод для закрытия соединения?

HraKK
Этот вариант я описал. Он не сработает по той же причине, что и первый - не все ссылающиеся на объект переменные уничтожены.
 

tf

крылья рулят
HraKK
Этот вариант я описал. Он не сработает по той же причине, что и первый - не все ссылающиеся на объект переменные уничтожены.
ты не описал вариант, который привел HraKK

-~{}~ 20.09.07 12:50:

Вопрос 1: Почему последний описаный вариант оставляет значение NULL в переменной, несмотря на то, что объект ей присваевается, и передается она по ссылке.
видимо я зря ночью удалил ссылку PHP FAQ: Ничего не работает! Что делать???
 

camka

не самка
tf
Аналогично нельзя закрыть соединение, непосредственно вызвав метод класса db и присвоив переменной $inst значение NULL, поскольку внешняя переменная $dbh все еще существует.
tf
видимо я зря ночью удалил ссылку
Простите?
Вот вам пример, как, обнуляя ссылку, можно закрыть соединение, если вы об этом:
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; // соединение закрывается
Но это я тоже описал. Не понял вашей реплики.

-~{}~ 20.09.07 14:42:

Оказывается, в пхп нельзя передавать параметр по ссылке и пересослаться им на другой объект внутри функции. Загадочная фича.

PHP:
function foo(&$var)
{
    $var =& $GLOBALS["baz"];
}
foo($bar);
There's no way to bind $bar in the calling scope to something else using the reference mechanism, since $bar is not available in the function foo (it is represented by $var, but $var has only variable contents and not name-to-value binding in the calling symbol table)
 

camka

не самка
tf
Не могли бы вы представить свой ответ в более распостраненной форме? Я ну никак не могу уловить мысль того, что вы пытаетесь сказать всеми теми урывками фраз, что появляются от вашего лица в последних постах этого топика.

Что с того, что $a и $b указывают на одну и ту же область памяти? Что это, по-вашему, объясняет и как связано с вопросом, который я задал?
 
Сверху