С деструктором проблемы, не удается понять принцип работы! =(
Код:
<?php
class User {
public $id;
public $name;
public $password;
public function __construct( $var1, $var2, $var3 ) {
$this-> id = $var1;
$this-> name = $var2;
$this-> password = $var3;
/*
public function __destruct() {
echo 'Объект прекратил существование!<br />';
}
*/
}}
$asdf = new User( '1', 'Имя', 'Пароль…' );
// $asdf -> __destruct();
echo "{$asdf -> id}<br />";
echo "{$asdf -> name}<br />";
echo "{$asdf -> password}<br />";
?>
Я так понимаю, что когда выполняется деструкционная функция должен выполняться код, содержащийся внутри этой функции…
1. Если снять первые "символы комментария", то код будет выполняться автоматом, но функция останется цела! Т.е. некакого разрушения объекта!
2. если оставить в покое многострочные комментарии и "освободить" только строку внешнего кода: "$asdf -> __destruct();", то происходит разрушение, но при этом не выполняется код, внутри деструкционной функции. (Этот вариант еще куда не шло, но в таком случае нет смысла писать эту функцию внутри класса)
3. Самое интересное, если убрать все "символы комментария", код выполняется два раза, но никакой деструкции…
Объясните что к чему! =((
13 июня 2009 в 11:01
Ну правильно. Когда пропадает последняя ссылка на деструктор? Когда завершается код. Все правильно.
13 июня 2009 в 10:00
Нет, Владислав, как оказалось деструктор вызывается как раз перед самым концом сценария… Я только что проверил это в сотый раз:
<?php
class User {
public function __destruct() {
echo "Вызван деструктор!";
}}
$asdf = new User();
echo "ПРОЧИЙ КОД НЕ СОДЕРЖАЩИЙ ССЫЛОК НА ОБЪЕКТ!";
?>
Вот код, кто как считает? строка "Вызван деструктор!" должна появиться перед или после строки "ПРОЧИЙ КОД НЕ СОДЕРЖАЩИЙ ССЫЛОК НА ОБЪЕКТ!"?
Вот ответ:
<html><head>
<title>Пробная СТР.</title>
</head><body>
ПРОЧИЙ КОД НЕ СОДЕРЖАЩИЙ ССЫЛОК НА ОБЪЕКТ!
</body></html>Вызван деструктор!
13 июня 2009 в 10:00
P.s. Как вы все понимаете, код я писал в рамках тегов <body></body>
11 июня 2009 в 16:05
Деструктор вызывается, когда пропадает последняя ссылка на объект.
10 июня 2009 в 19:05
Вы все правильно написали, я разобрался с деструктурами, и не без вашей, к стати, помощи! Спасибо! =)
Фишка в том, что деструкторы не нуждаются в вызове (аналогичнго конструкторам), а код заложенный в объявлении деструкционной функции выполняется при уничтожении экземпляра класса! (ручном уничтожении либо конце сценария)
10 июня 2009 в 1:00
дело было вечером, делать было нечего…
Твоем коде ты просто вызываешь ф-цию деструкт, которая выводит сообщение, но не уничтожает экземпляр класса.
Вот код:
<?php
class User {
public $id;
public $name;
public $password;
public function __construct( $var1, $var2, $var3 ) {
$this-> id = $var1;
$this-> name = $var2;
$this-> password = $var3;
}
public function __destruct() {
echo 'Объект прекратил существование!<br />';
}
}
$asdf = new User( '1', 'Имя', 'Пароль…' );
//$asdf -> __destruct();
//unset($asdf);
echo 'After actions:<br>';
echo "{$asdf -> id}<br />";
echo "{$asdf -> name}<br />";
echo "{$asdf -> password}<br />";
?>
Если убрать коммент с unset'а, то будет вызван сначало деструктор, а потом уничтожен класс.
Если же раскомментить строку с вызовом ф-ции __destruct();
то мы просто получим текстовое сообщение, но экземпляр класса уничтожен не будет.
З.Ы. В ООП не шарю вообще, так что если где-то ошибся – сорь)
9 июня 2009 в 23:04
ну во-первых у вас в коде деструктор объявлен внутри ф-ции конструктора)
public function __construct( $var1, $var2, $var3 ) {
$this-> id = $var1;
$this-> name = $var2;
$this-> password = $var3;
/*
public function __destruct() {
echo 'Объект прекратил существование!<br />';
}
*/
}
change to
public function __construct( $var1, $var2, $var3 ) {
$this-> id = $var1;
$this-> name = $var2;
$this-> password = $var3;
}
/*
public function __destruct() {
echo 'Объект прекратил существование!<br />';
}
*/