Объясните поведение деструкторов...

Лисю

Guest
Объясните поведение деструкторов...

PHP:
<?
class Database{
	private $lnk = null;
	
	//Устанавливаем коннект c БД
	function connect()	{
		if(is_resource($this->lnk)) return true;
		
		$this->lnk = mysql_connect("localhost", "", "");
			if(is_resource($this->lnk))
				mysql_select_db("cms", $this->lnk);
	}
	
	function __construct(){
		$this->connect();
		//	Если это ресурс
		if(is_resource($this->lnk))
				echo "<br>КОНСТРУКТОР: $this->lnk АКТИВЕН!<br>";
			else echo "<br>КОНСТРУКТОР: $this->lnk НЕАКТИВЕН!<br>";
	}
	
	function __destruct(){
		mysql_close($this->lnk);
			//	Если это ресурс
			if(is_resource($this->lnk))
				echo "<br>ДЕСТРУКТОР: $this->lnk АКТИВЕН!<br>";
			else echo "<br>ДЕСТРУКТОР: $this->lnk НЕАКТИВЕН!<br>";
	}
}

$o1 = new Database;
$o2 = new Database;
echo "<br>Выходим из программы<br>";
?>
Суть: создаём 2 РАЗНЫХ объекта класса.
Как я понимаю, в каждом объекте должны жить 2 разные перенменные $this->lnk, символизирующие ссылку на коннеут с БД.

Запустим этот пример:

PHP:
КОНСТРУКТОР: Resource id #2 АКТИВЕН!

КОНСТРУКТОР: Resource id #2 АКТИВЕН!

Выходим из программы

ДЕСТРУКТОР: Resource id #2 АКТИВЕН!

ДЕСТРУКТОР: Resource id #2 НЕАКТИВЕН!
почему деструктор первый раз пишет АКТИВЕН? Он же должен был разрушить $this->link ??!!!
 

Profic

just Profic (PHP5 BetaTeam)
Никому он ничего не должен. Ресурс он и после закрытия коннекта ресурс. См. [m]is_resource[/m](), комментари.
А по поводу деструктора второго объекта (имхо) см. [m]mysql_connect[/m](). Поведение при неоднократном вызове при одинаковых параметрах.
 

Лисю

Guest
Profic
Да, ты прав. Ман:
Если второй вызов функции произошёл с теми же аргументами mysql_connect(), новое соединение не будет установлено. Вместо этого функция вернёт ссылку на уже установленное соединение.
Ресурс он и после закрытия коннекта ресурс. См. is_resource(), комментари.
а как же это:

ДЕСТРУКТОР: Resource id #2 НЕАКТИВЕН!
???
 

Profic

just Profic (PHP5 BetaTeam)
Хе. Оказывается все проще. Для того, что такой ресурс перестал быть ресурсом его нужно такое кол-во раз закрыть сколько раз он был открыт. Банальный reference counter. Т.е. "Ресурс он и после закрытия коннекта ресурс." не совсем верно.

PHP:
<?php
$res1 = mysql_connect("localhost", "profic", "");
$res = mysql_connect("localhost", "profic", "");
mysql_close($res);
if(is_resource($res)) {
	echo $res . " АКТИВЕН!\n";
} else {
	echo $res . " НЕАКТИВЕН!\n";
}
mysql_close($res);
if(is_resource($res)) {
	echo $res . " АКТИВЕН!\n";
} else {
	echo $res . " НЕАКТИВЕН!\n";
}
?>
 
Сверху