assert

(PHP 4, PHP 5, PHP 7, PHP 8)

assertVerifica una aserción

Descripción

assert(mixed $assertion, Throwable|string|null $description = null): bool

assert() permite definir expectativas: aserciones que tienen efecto en los entornos de desarrollo y prueba, pero que están optimizadas para no tener costo en producción.

Las aserciones deben ser utilizadas únicamente como funcionalidad de depuración. Un caso de uso para las aserciones es servir de verificaciones de coherencia para precondiciones que siempre deberían ser true, y si no se cumplen, indican errores de programación. Otro caso de uso es garantizar la presencia de ciertas funcionalidades como funciones de extensión o ciertos límites y funcionalidades del sistema.

Como las aserciones pueden ser configuradas para ser eliminadas, no deben ser utilizadas para operaciones normales en curso de ejecución, tales como verificaciones de los parámetros de entrada. En regla general, el código debe comportarse como se espera incluso si la verificación de aserciones está desactivada.

assert() verificará que la expectativa dada en assertion es satisfecha. Si no es el caso y por lo tanto el resultado es false, tomará la acción apropiada en función de la configuración de assert().

El comportamiento de assert() está dictado por los siguientes parámetros INI:

Assert Opciones de configuración
Nombre Por defecto Descripción Historial de cambios
zend.assertions 1
  • 1 : genera y ejecuta el código (modo desarrollo)
  • 0 : genera el código pero lo evita en el momento de la ejecución
  • -1 : no genera el código (modo producción)
assert.active true Si false, assert() no verifica la expectativa y siempre devuelve true, sin condición. Obsolète a partir de PHP 8.3.0.
assert.callback null

Una función definida por el usuario a llamar cuando una aserción falla. Su firma debería ser:

assert_callback(
    string $file,
    int $line,
    null $assertion,
    string $description = ?
): void

Anterior a PHP 8.0.0, la firma de la función de retrollamada debería ser:

assert_callback(
    string $file,
    int $line,
    string $assertion,
    string $description = ?
): void

Obsolète a partir de PHP 8.3.0.
assert.exception true Si true, lanzará una AssertionError si la expectativa no es cumplida. Obsolète a partir de PHP 8.3.0.
assert.bail false Si true, interrumpirá la ejecución del script PHP si la expectativa no es cumplida. Obsolète a partir de PHP 8.3.0.
assert.warning true Si true, emitirá un E_WARNING si la expectativa no es cumplida. Este parámetro INI es ineficaz si assert.exception está activado. Obsolète a partir de PHP 8.3.0.

Parámetros

assertion

Esto es una expresión cualquiera que devuelve un valor, que será ejecutada y cuyo resultado será utilizado para indicar si la aserción ha tenido éxito o ha fallado.

Advertencia

Anterior a PHP 8.0.0, si assertion era una string, era interpretada como código PHP y ejecutada vía eval(). Esta cadena era transmitida a la función de retrollamada como tercer argumento. Este comportamiento era OBSOLETO en PHP 7.2.0, y es ELIMINADO a partir de PHP 8.0.0

description

Si description es una instancia de Throwable, será lanzada únicamente si assertion es ejecutada y falla.

Nota:

A partir de PHP 8.0.0, esto se hace antes de llamar a la función de retrollamada de aserción eventualmente definida

Nota:

A partir de PHP 8.0.0, el objeto object será lanzado independientemente de la configuración de assert.exception.

Nota:

A partir de PHP 8.0.0, el parámetro assert.bail no tiene ningún efecto en este caso.

Si description es una string, este mensaje será utilizado si una excepción o un aviso es emitido. Una descripción opcional, que será incluida en el mensaje de fallo si la assertion falla.

Si description es omitido. Una descripción por defecto equivalente al código fuente de la llamada de assert() es creada en el momento de la compilación.

Valores devueltos

assert() devolverá siempre true si al menos una de las siguientes condiciones es verdadera:

  • zend.assertions=0
  • zend.assertions=-1
  • assert.exception=1
  • assert.bail=1
  • Un objeto de excepción personalizado es pasado a description.

Si ninguna de las condiciones es verdadera, assert() devolverá true si assertion es verdadera, y false en caso contrario.

Historial de cambios

Versión Descripción
8.3.0 Todas las configuraciones INI assert. han sido deprecadas.
8.0.0 La función assert() ya no evaluará los argumentos de tipo string, en su lugar, serán tratados como cualquier otro argumento. assert($a == $b) debería ser utilizado en lugar de assert('$a == $b'). La directiva assert.quiet_eval php.ini y la constante ASSERT_QUIET_EVAL también han sido eliminadas, ya que no tendrían ningún efecto.
8.0.0 Si description es una instancia de Throwable, el objeto es lanzado si la aserción falla, independientemente del valor de assert.exception.
8.0.0 Si description es una instancia de Throwable, ninguna función de retrollamada de usuario es llamada incluso si está definida.
8.0.0 Declarar una función que se llame assert() dentro de un espacio de nombres ya no está permitido, y genera una E_COMPILE_ERROR.
7.3.0 Declarar una función que se llame assert() dentro de un espacio de nombres se volvió obsoleto. Dichas declaraciones ahora generan una E_DEPRECATED.
7.2.0 El uso de una string como assertion se volvió obsoleto. Esto ahora emite una notificación E_DEPRECATED cuando assert.active y zend.assertions están ambos definidos a 1.

Ejemplos

Ejemplo #1 Ejemplo de assert()

<?php
assert
(1 > 2);
echo
'Hi!';
?>

Si las aserciones están activadas (zend.assertions=1) el ejemplo anterior mostraría:

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

Si las aserciones están desactivadas (zend.assertions=0 o zend.assertions=-1) el ejemplo anterior mostraría:

Hi!

Ejemplo #2 Uso de un mensaje personalizado

<?php
assert
(1 > 2, "Expected one to be greater than two");
echo
'Hi!';
?>

Si las aserciones están activadas, el ejemplo anterior mostraría: el ejemplo anterior mostraría:

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

Si las aserciones están desactivadas, el ejemplo anterior mostraría: el ejemplo anterior mostraría:

Hi!

Ejemplo #3 Uso de una clase de excepción personalizada

<?php
class ArithmeticAssertionError extends AssertionError {}

assert(1 > 2, new ArithmeticAssertionError("Expected one to be greater than two"));
echo
'Hi!';

Si las aserciones están activadas, el ejemplo anterior mostraría: el ejemplo anterior mostraría:

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

Si las aserciones están desactivadas, el ejemplo anterior mostraría:

Hi!

Ver también

  • assert_options() - Establecer/obtener valores de las directivas relacionadas con las aserciones

add a note

User Contributed Notes 2 notes

up
33
hodgman at ali dot com dot au
16 years ago
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.
up
9
sven at rtbg dot de
1 year ago
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!
To Top