assert
(PHP 4, PHP 5)
assert — Проверка утверждения (равен ли результат FALSE
)
Описание
assert() проверит заданное утверждение
assertion
и совершит соответствующее действие, если
результатом проверки окажется FALSE
.
Если assertion
задается в виде строки, оно будет
рассматриваться функцией assert() как PHP код. Представление
assertion
в виде строки имеет свои преимущества.
Во-первых, выключение проверки утверждений снижает накладные расходы. Во-вторых,
сообщения о провале проверки будут содержать само утверждение
assertion
. То есть, если передать в качестве
assertion
какое-либо условное выражение, это условие
невозможно будет получить в явном виде, в котором оно передавалось в проверяющую
функцию, которую вы возможно определили с помощью
assert_options(). Это условное выражение будет вычислено и
преобразовано в строку до вызова проверяющей функции, соответственно логическое
FALSE
будет фигурировать в сообщении как пустая строка.
Утверждения должны использоваться только в целях отладки. Их можно использовать
для тестирования каких-то условий, которые в штатных ситуациях всегда принимают
значение TRUE
, обратное должно указывать на программные ошибки. Также их можно
использовать, чтобы удостовериться в наличии каких-либо расширений или системных
ограничений.
Утверждения не должны использоваться в обычных операциях, таких как проверка входных параметров. Скрипт должен корректно выполняться, если отключить проверку утверждений.
Поведение функции assert() можно изменять с помощью функции assert_options() или заданием .ini-настроек.
Функция assert_options() и директива
ASSERT_CALLBACK
позволяют задать callback-функцию,
которая будет вызываться при провале проверки утверждения.
Возможность вызывать callback-функции из assert() может быть полезна для создания автоматизированных тестовых пакетов. Посредством этих функций можно извлекать код, переданный на проверку вместе с информацией о том, где эта проверка была осуществлена. Подобную информацию можно получить и другими методами, однако использование утверждений быстрей и проще.
Callback-функция должна принимать три аргумента. Первый аргумент должен содержать
файл, в котором утверждение не прошло проверку. Второй аргумент отвечает за
номер строки в этом файле. В третьем аргументе будет передаваться выражение,
содержащее ошибку (если таких несколько, строковые значение, вроде 1 или "два"
не будут передаваться через этот аргумент). Пользователи PHP версий 5.4.8 и
выше могут задать четвертый необязательный аргумент
description
, который будет также передан в функцию
assert().
Список параметров
-
assertion
-
Утверждение.
-
description
-
Дополнительное описание, которое будет включено в сообщение об ошибке, если проверка
assertion
завершится неудачей.
Возвращаемые значения
FALSE
в случае провала проверки, TRUE
в остальных случаях.
Список изменений
Версия | Описание |
---|---|
5.4.8 |
Добавлен аргумент description . Также
description передается четвертым аргументом в
callback-функцию в режиме ASSERT_CALLBACK .
|
Примеры
Пример #1 Обработка ошибочного утверждения пользовательским обработчиком
<?php
// Активируем проверку утверждений и сделаем его фоновым
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_QUIET_EVAL, 1);
// Создадим функцию обработчик
function my_assert_handler($file, $line, $code)
{
echo "<hr>Проверка утвеждения провалена:
Файл '$file'<br />
Строка '$line'<br />
Код '$code'<br /><hr />";
}
// Зададим callback-функцию
assert_options(ASSERT_CALLBACK, 'my_assert_handler');
// Создадим заведомо неверную команду
assert('mysql_query("")');
?>
Пример #2 Использование пользовательского обработчика для вывода описания ошибки
<?php
// Активируем утверждение и переводим в тихий режим
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_QUIET_EVAL, 1);
// Создаем обработчик
function my_assert_handler($file, $line, $code, $desc = null)
{
echo "Проверка завершилась неудачей в $file:$line: $code";
if ($desc) {
echo ": $desc";
}
echo "\n";
}
// Задаем callback-функцию
assert_options(ASSERT_CALLBACK, 'my_assert_handler');
// Спровоцируем ошибку для проверки
assert('2 < 1');
assert('2 < 1', 'Два меньше одного');
?>
Результат выполнения данного примера:
Assertion failed at test.php:21: 2 < 1 Assertion failed at test.php:22: 2 < 1: Два меньше одного
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Изменение поведения PHP
- PHP Опции и Информация
- assert_options
- assert
- cli_get_process_title
- cli_set_process_title
- dl
- extension_loaded
- gc_collect_cycles
- gc_disable
- gc_enable
- gc_enabled
- gc_mem_caches
- get_cfg_var
- get_current_user
- get_defined_constants
- get_extension_funcs
- get_include_path
- get_included_files
- get_loaded_extensions
- get_magic_quotes_gpc
- get_magic_quotes_runtime
- get_required_files
- get_resources
- getenv
- getlastmod
- getmygid
- getmyinode
- getmypid
- getmyuid
- getopt
- getrusage
- ini_alter
- ini_get_all
- ini_get
- ini_restore
- ini_set
- magic_quotes_runtime
- main
- memory_get_peak_usage
- memory_get_usage
- php_ini_loaded_file
- php_ini_scanned_files
- php_logo_guid
- php_sapi_name
- php_uname
- phpcredits
- phpinfo
- phpversion
- putenv
- restore_include_path
- set_include_path
- set_magic_quotes_runtime
- set_time_limit
- sys_get_temp_dir
- version_compare
- zend_logo_guid
- zend_thread_id
- zend_version
Коментарии
As noted on Wikipedia - "assertions are primarily a development tool, they are often disabled when a program is released to the public." and "Assertions should be used to document logically impossible situations and discover programming errors— if the 'impossible' occurs, then something fundamental is clearly wrong. This is distinct from error handling: most error conditions are possible, although some may be extremely unlikely to occur in practice. Using assertions as a general-purpose error handling mechanism is usually unwise: assertions do not allow for graceful recovery from errors, and an assertion failure will often halt the program's execution abruptly. Assertions also do not display a user-friendly error message."
This means that the advice given by "gk at proliberty dot com" to force assertions to be enabled, even when they have been disabled manually, goes against best practices of only using them as a development tool.
With the current changes made in PHP 8.3 (deprecating the INI settings affecting assertions) and the increasing amount of open source libraries utilizing `assert()` as an easy means to ensure obscure return cases of PHP core function calls are in fact not triggered (e.g. no NULL or FALSE has been returned, but the useful value), the comment made about assertions only being a tool used during development should be considered invalid.
In addition, static code analysis tools use the knowledge gained from `assert($x instanceof MyClass)` to know the type or types that are possible.
Assertions are actively being used in production code, they are useful, and disabling them would only gain minimal performance benefits because the asserted expression usually is very small.
Use this tool where applicable!