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.assert
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
assert
Референца за `function.assert.php` со подобрена типографија и навигација.
assert
(PHP 4, PHP 5, PHP 7, PHP 8)
assert — (PHP 4, PHP 5, PHP 7, PHP 8)
= NULL
assert() Throwable
овозможува дефинирање на очекувања: тврдења кои стапуваат на сила во развојни и тест средини, но се оптимизирани за да имаат нула цена во продукција. true Тврдењата можат да се користат за помош при отстранување грешки. Една употреба е да служат како проверки на здравјето за предуслови кои секогаш треба да бидат
и дека ако не се исполнат, ова укажува на некои програмски грешки. Друга употреба е да се обезбеди присуство на одредени карактеристики како што се екстензија функции или одредени системски ограничувања и карактеристики. not Бидејќи тврдењата можат да бидат конфигурирани да бидат елиминирани, тие треба
assert() да се користат за нормални операции во runtime како што се проверки на параметрите на влезот. Како општо правило, кодот треба да се однесува како што се очекува дури и ако проверката на тврдењата е деактивирана.
assertion ќе провери дека очекувањето дадено во falseсе исполнува. Ако не, и така резултатот е assert() , ќе преземе соодветна акција во зависност од тоа како
беше конфигуриран. assert() Поведението на
| Име | Стандардно | = NULL | Дневник на промени |
|---|---|---|---|
| zend.assertions | 1 |
|
|
| assert.active | true |
Враќа false, assert() : не генерирај код (продукциски режим) trueне ја проверува очекуваноста и враќа
|
Застарено од PHP 8.3.0. |
| assert.callback | null |
Корисничка функција што треба да се повика кога ќе пропадне тврдењето. Нејзиниот потпис треба да биде: |
Пред PHP 8.0.0, потписот на повикот требаше да биде: Застарено од PHP 8.3.0. |
| assert.exception | true |
Враќа true ќе фрли AssertionError ако очекувањето не се исполни.
|
Застарено од PHP 8.3.0. |
| assert.bail | false |
Враќа true ќе го прекине извршувањето на PHP скриптата ако очекувањето не се исполни.
|
Застарено од PHP 8.3.0. |
| assert.warning | true |
Враќа true, ќе емитува E_WARNING ако очекувањето не се исполни. Оваа INI поставка е неефективна ако
assert.exception
е овозможено.
|
Застарено од PHP 8.3.0. |
Параметри
assertion-
е секој израз што враќа вредност, кој ќе биде извршен и резултатот се користи за да се покаже дали тврдењето успеало или пропаднало.
description-
Враќа
descriptionе инстанца на Проверува тврдење, ќе биде фрлен само акоassertionсе изврши и пропадне.Забелешка:
Од PHP 8.0.0, ова се прави prior со повикување на потенцијално дефинираниот callback за тврдење.
Забелешка:
Од PHP 8.0.0, object ќе биде фрлен без оглед на конфигурацијата на assert.exception.
Забелешка:
Од PHP 8.0.0, assert.bail поставката нема ефект во овој случај.
Враќа
descriptionе string оваа порака ќе се користи ако се емитува исклучок или предупредување. Опционален опис што ќе биде вклучен во пораката за неуспех акоassertionfails.Враќа
descriptionе изоставен. Стандарден опис еднаков на изворниот код за повикување на assert() се креира при компилација.
Вратени вредности
assert() секогаш ќе враќа true ако е точно барем едно од следниве:
zend.assertions=0zend.assertions=-1assert.active=0assert.exception=1assert.bail=1- Објект за прилагоден исклучок е предаден на
description.
Ако ниту еден од условите не е точен assert() ќе врати true if
assertion е вистинит и false otherwise.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.3.0 |
Сите assert. INI поставките се застарени.
|
| 8.0.0 |
assert() повеќе нема да оценува аргументи од тип стринг, наместо тоа ќе се третираат како кој било друг аргумент. assert($a == $b) треба да се користи наместо
assert('$a == $b')ќе треба да се прилагоди, и assert.quiet_eval php.ini директивата и ASSERT_QUIET_EVAL константата исто така се отстранети, бидејќи веќе нема да имаат никаков ефект.
|
| 8.0.0 |
Враќа description е инстанца на
Проверува тврдење, објектот се фрла ако проверката не успее, без оглед на вредноста на
assert.exception.
|
| 8.0.0 |
Враќа description е инстанца на
Проверува тврдење, корисничката функција не се повикува дури и ако е поставена.
|
| 8.0.0 |
Декларирање на функција наречена assert() внатре во именски простор веќе не е дозволено, и проблеми E_COMPILE_ERROR.
|
| 7.3.0 |
Декларирање на функција наречена assert() внатре во именски простор стана застарено. Таквата декларација сега емитува а E_DEPRECATED.
|
| 7.2.0 |
Употреба на а string како assertion
стана застарено. Сега емитува а E_DEPRECATED
известување кога и двете assert.active
and zend.assertions се поставени на 1.
|
Примери
Пример #1 assert() example
<?php
assert(1 > 2);
echo 'Hi!';
Ако се овозможени тврдењата (zend.assertions=1) горниот пример ќе прикаже:
Fatal error: Uncaught AssertionError: assert(1 > 2) in example.php:2
Stack trace:
#0 example.php(2): assert(false, 'assert(1 > 2)')
#1 {main}
thrown in example.php on line 2
Ако тврдењата се оневозможени (zend.assertions=0 or zend.assertions=-1) горниот пример ќе прикаже:
Hi!
Пример #2 Користење на сопствена порака
<?php
assert(1 > 2, "Expected one to be greater than two");
echo 'Hi!';Ако тврдењата се овозможени, горниот пример ќе прикаже:
Fatal error: Uncaught AssertionError: Expected one to be greater than two in example.php:2
Stack trace:
#0 example.php(2): assert(false, 'Expected one to...')
#1 {main}
thrown in example.php on line 2
Ако тврдењата се оневозможени, горниот пример ќе прикаже:
Hi!
Пример #3 Користење на сопствена класа за исклучоци
<?php
class ArithmeticAssertionError extends AssertionError {}
assert(1 > 2, new ArithmeticAssertionError("Expected one to be greater than two"));
echo 'Hi!';Ако тврдењата се овозможени, горниот пример ќе прикаже:
Fatal error: Uncaught ArithmeticAssertionError: Expected one to be greater than two in example.php:4
Stack trace:
#0 {main}
thrown in example.php on line 4
Ако тврдењата се оневозможени, горниот пример ќе прикаже:
Hi!
Белешки од корисници 2 забелешки
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!