Проблемы с __destruct()

exxbrain

Новичок
Проблемы с __destruct()

Перед созданием очередного экземпляра класса автоматически происходит __destruct().
Может быть я чего-либо недопонимаю, но что может мешать использовать
объект класса 1 объекту класса 3
без предварительного уничтожения не имеющего к нему никакого отношения экземпляра класса 1, который был создан объектом класса 2?

PHP:
class Class1 {
	public function __construct() {
		echo "instanced<br/>";
	}
	
	public function __destruct() {
		echo "destructed<br/>";
	}
}

class Class2 {
	public function __construct() {
		$obj1 = new Class1();
	}
}

class Class3 {
	public function __construct() {
		$obj2 = new Class1();
	}
}

$obj3 = new Class2();
$obj4 = new Class3();
В результате получаем:

instanced
destructed
instanced
destructed

А нужно:

instanced
instanced
destructed
destructed

это происходит в следующем случае
PHP:
$obj3 = new Class1();
$obj4 = new Class1();
 

God

Новичок
Закончилась видимость переменной, объявленной в конструкторе и сработал деструктор. Видимо хотелось приблизительно так:
PHP:
class Class1 {
    private $parent;
    public function __construct($parent) {
    	$this->parent = $parent;
        echo "instanced $this->parent<br/>";
    }
    
    public function __destruct() {
        echo "destructed $this->parent<br/>";
    }
}

class Class2 {
    private $obj;
    public function __construct() {
        $this->obj = new Class1('Class2');
    }
}

class Class3 {
    private $obj;
    public function __construct() {
        $this->obj = new Class1('Class3');
    }
}

$obj3 = new Class2();
$obj4 = new Class3();
 

exxbrain

Новичок
God. Хм...


-~{}~ 16.06.07 12:34:

Т.е. получается - все, что входит в свойства класса остается в видимости, даже не смотря на то, что свойство private? А так - подразумевается, что мы больше никогда не воспользуемся данным объектом и его можно деструктитить... А если у меня там статические свойства?
 

exxbrain

Новичок
StUV Там статические свойства! если тебе так больше нравится. дестрактить не хочу - все экземпляры должны использовать их.
Не вижу смысла заводить отдельное свойство в каждом классе или синглтон.
 

exxbrain

Новичок
PHP:
class Class1 {
        private static $init = false;
        
	public function __construct() {
                if (!self::$init) {
                        self::$init = "done";
                }
		echo "instanced<br/>";
	}
	
	public function __destruct() {
		echo "destructed<br/>";
	}
}
Экземпляры вот этого класса.
 

jonjonson

Охренеть
exxbrain, разница между этим
PHP:
public function __construct() {
        $obj1 = new Class1();
    }
и этим
PHP:
public function __construct() {
        $this->obj = new Class1();
    }
понятна?
В первом случае переменная $obj1 появилась в конструкторе и благополучно сдохла.
Во втором случае объект хранится всё время жизни создавшего его в себе объекта.
 

exxbrain

Новичок
jonjonson
Т.е. попытка группировки объектов определенного класса, которые должны работать в разных частях системы и зависеть друг от друга посредством статических аттрибутов, проваливается без создания в каждом из использующих эти объекты классов аттрибутов, которым присваиваются данные объекты. Потому как автоматически срабатывает деструктор.
По-моему логика здесь немного нарушена.
Придется приспосабливаться. :)
 

cDLEON

Онанист РНРСlub
exxbrain
А ты попробуй так:
PHP:
function __construct () {
 static $obj1;
 $obj1=new Class1();
}
Где нарушение логики? В твоём примере это не статическая переменная, это временная, локальная переменная. Зачем ей существовать когда функция работу завершила?
Если ты, конечно, не пытаешься писать в стиле джавы. Потому как там область видимости задаётся немного по-другому. Как и... доступ к ней.
 

jonjonson

Охренеть
exxbrain, собственно cDLEON тебе ответил :)
Статические переменные объявляются в php явно.
 

exxbrain

Новичок
jonjonson
какая разница где их объявить - тем более, что статический аттрибут связывает объекты класса class1, а не является аттрибутом, какого-либо из использующих эти объекты классов...?

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

Fally

Новичок
Короче, надо тебе документацию внимательно раз 10 прочесть... и задаться вопросом: "А был ли я прав?"
 

Wicked

Новичок
exxbrain
Статическое св-во класса A может существовать без объектов класса A, и, в свою очередь, на неудаление этих объектов оно никак не влияет.

-~{}~ 20.06.07 00:01:

не хочет он синглтон делать... пфф... ну и нравы пошли
 

exxbrain

Новичок
Wicked
Спасибо, во-первых, за понимание ). И действительно ошибка - в другом месте.
Насчет кучи объектов это я загнул конечно, легче передать объект в качестве ссылки.
Люди советуют избегать синглтонов... Типа такой глобальный (синглтон)... Сложно управлять.
 
Сверху