PHP5 вызывает __destruct (), если вы используете перенаправление? - PullRequest
3 голосов
/ 22 сентября 2009

Я обнаружил, что PHP5 не вызывает функцию __destruct (), если у меня есть следующие настройки:

class test {
 __destruct()
 {
  echo 'hehe';
  exit;
 }
}

header('Location: http://test.com/');
exit;

Он никогда не вызывает функцию уничтожения

1 Ответ

12 голосов
/ 22 сентября 2009

Деструктор называется:

  • для любого объекта, который вы создали
    • в той части скрипта, которую вы опубликовали, вы не создали ни одного объекта - может быть, это причина того, что деструктор не был вызван?
  • в конце скрипта PHP

Использование заголовка для перенаправления не препятствует вызову деструктора.


Также обратите внимание, что деструктор вызывается в конце сценария PHP - но не предотвращает перенаправление, так как заголовок, говорящий «redirect», уже создан.

Например, с этим кодом:

class Test {
    public function __destruct() {
        echo 'hehe';
        file_put_contents('/tmp/test-desctructor.txt', "glop\n");
        exit;
    }
}

$a = new Test();

header('Location: http://example.com/');
exit;

(обратите внимание, что я исправил несколько ошибок и добавил фактическое описание класса)

Вы не увидите «hehe» на выходе, но обнаружите, что файл /tmp/test-desctructor.txt создан:

$ cat /tmp/test-desctructor.txt
glop

Вам нужно будет удалить перенаправление, если вы хотите получить «hehe» на выходе.


Деструктор вызывается после того, как заголовок был сгенерирован - и вызов exit из деструктора не изменит тот факт, что этот заголовок уже был сгенерирован.

О, а вот примечание из руководства (цитата - внизу страницы) :

Примечание: деструкторы вызывались во время Завершение работы скрипта имеет заголовки HTTP уже отправлено.

Вот почему вы не видите свою строку "hehe": вызывается деструктор; вы просто не видите его на экране; -)

Вот почему я использовал файл в моем примере, кстати ;-)

...