singlepost

PHP-деструкторы! << На главную или назад  

С деструктором проблемы, не удается понять принцип работы! =(
Код:

<?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. Самое интересное, если убрать все "символы комментария", код выполняется два раза, но никакой деструкции…

Объясните что к чему! =((

41 ответов в теме “PHP-деструкторы!”

  1. 7
    Илья Антипенко ответил:

    Ну правильно. Когда пропадает последняя ссылка на деструктор? Когда завершается код. Все правильно.

  2. 6
    Игорь Полищук ответил:

    Нет, Владислав, как оказалось деструктор вызывается как раз перед самым концом сценария… Я только что проверил это в сотый раз:

    <?php
    class User {
    public function __destruct() {
    echo "Вызван деструктор!";
    }}

    $asdf = new User();

    echo "ПРОЧИЙ КОД НЕ СОДЕРЖАЩИЙ ССЫЛОК НА ОБЪЕКТ!";
    ?>

    Вот код, кто как считает? строка "Вызван деструктор!" должна появиться перед или после строки "ПРОЧИЙ КОД НЕ СОДЕРЖАЩИЙ ССЫЛОК НА ОБЪЕКТ!"?

    Вот ответ:

    <html><head>
    <title>Пробная СТР.</title>
    </head><body>

    ПРОЧИЙ КОД НЕ СОДЕРЖАЩИЙ ССЫЛОК НА ОБЪЕКТ!
    </body></html>Вызван деструктор!

  3. 5
    Игорь Полищук ответил:

    P.s. Как вы все понимаете, код я писал в рамках тегов <body></body>

  4. 4
    Владислав Самохин ответил:

    Деструктор вызывается, когда пропадает последняя ссылка на объект.

  5. 3
    Игорь Полищук ответил:

    Вы все правильно написали, я разобрался с деструктурами, и не без вашей, к стати, помощи! Спасибо! =)

    Фишка в том, что деструкторы не нуждаются в вызове (аналогичнго конструкторам), а код заложенный в объявлении деструкционной функции выполняется при уничтожении экземпляра класса! (ручном уничтожении либо конце сценария)

  6. 2
    Илья Антипенко ответил:

    дело было вечером, делать было нечего…

    Твоем коде ты просто вызываешь ф-цию деструкт, которая выводит сообщение, но не уничтожает экземпляр класса.

    Вот код:
    <?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();
    то мы просто получим текстовое сообщение, но экземпляр класса уничтожен не будет.

    З.Ы. В ООП не шарю вообще, так что если где-то ошибся – сорь)

  7. 1
    Илья Антипенко ответил:

    ну во-первых у вас в коде деструктор объявлен внутри ф-ции конструктора)

    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 />';
    }
    */

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.