Assert или exit/die для проверки headers_sent() в PHP?

Я пишу класс PHP для генерации вывода HTML. По соображениям безопасности я должен убедиться, что ни один код не отправил вывод перед этим классом. Вот два варианта, о которых я подумал:

Вариант 1: как утверждение

if( !$this->headersSent ) {
    assert( '!headers_sent()' );
    $this->headersSent = true;
    // ...
}

Вариант 2. Использование if заявление и die()

if( !$this->headersSent ) {
    if( headers_sent() ) {
        die( 'For security, refusing to continue: headers already sent.' );
    }
    $this->headersSent = true;
    // ...
}

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

  • Этот класс является частью определенного приложения, и я считаю ошибкой программирования отправку вывода HTML без использования этого класса. Так assert() должен быть использован.
  • С другой стороны, однажды это приложение может стать открытым исходным кодом, и кто-то может настроить его. У него могут быть отключены утверждения, и поэтому возникающая проблема безопасности может остаться незамеченной. Так die() должен быть использован.

Какой из них лучше практиковать?

1 ответ

Решение

Вы, вероятно, хотели бы бросить исключение там.

class HeadersAlreadySentException extends Exception { }
throw new HeadersAlreadySentException('Headers already sent. Cannot continue.');

http://php.net/manual/en/language.exceptions.php

Другие вопросы по тегам