isset($var) devuelve true si la variable existe y su valor no es null. Devuelve false para una variable no definida, una eliminada con unset o una que contiene null, y nunca imprime un warning.
isset() solo mira si algo está ahí. Un valor definido pero vacío, como 0, "" o [], sigue devolviendo true. Si quieres "definido y no vacío", usa empty (negado).
Comprobar si existe una clave de array con isset
Aquí es donde más se usa isset(). Leer una clave que no existe imprime Warning: Undefined array key en una instalación normal de PHP; comprobarla antes con isset(), no. También funciona con claves anidadas, y se detiene sin ruido en el primer nivel que falta.
Cuando solo necesitas el valor o uno por defecto, $user["website"] ?? "none" hace la misma comprobación en un paso. Consulta el operador de fusión de null.
isset con varias variables
Pasa varios argumentos e isset() devuelve true solo si todos están definidos y no son null. Es una forma corta de comprobar que llegaron todos los campos obligatorios.
isset con cadenas y objetos
En una cadena, isset($str[5]) comprueba si hay un carácter en la posición 5, lo que sirve como comprobación rápida de longitud. En un objeto, comprueba una propiedad; en una clase con datos privados, isset() llama al método __isset() si la clase lo define.
isset vs empty vs is_null
Elige un valor de $x en la tabla para comparar las tres comprobaciones y el cast (bool). Cada celda la calculó PHP 8.3.
| $x | isset | empty | is_null | bool |
|---|---|---|---|---|
| null | ||||
| false | ||||
| 0 | ||||
| "0" | ||||
| "" | ||||
| " " | ||||
| [] | ||||
| "a" | ||||
| 1 | ||||
| 0.0 | ||||
| "0.0" |
El patrón que hay que recordar:
isset()esfalsesolo paranully para lo que no existe.empty()estruepara eso y además para cualquier valor falsy:false,0,0.0,"","0",[].is_null()da lo contrario deisset()con variables que existen, pero avisa cuando la variable no está definida. Usaisset()o=== nullen su lugar.
Comprobar si se envió un formulario
isset() es la forma clásica de ver si llegó un campo de formulario. Ejecuta este bloque, escribe un nombre y pulsa Send: el mismo script se ejecuta otra vez con $_POST lleno.
Un campo de texto vacío se envía igualmente, como "", así que isset($_POST["name"]) es true tras cualquier envío. Una casilla sin marcar no se envía en absoluto, lo que hace de isset() justo la prueba adecuada para las casillas. Para exigir un valor no vacío, comprueba la cadena recortada como hace el bloque. La página de formularios construye un formulario completo con validación.
isset vs array_key_exists
Las dos coinciden en todo salvo en una clave cuyo valor es null. isset() la trata como si faltara; array_key_exists(), no.
Si en tus datos "puesto a null" significa algo distinto de "sin configurar", usa array_key_exists(). Si no, isset() es más corto, y como es una construcción del lenguaje y no una llamada a función, también es algo más rápido.
Error frecuente: isset con una expresión
isset() solo acepta variables, elementos de array y propiedades. Pasarle el resultado de una función o una constante es un error de compilación:
<?php
if (isset(trim($input))) {}
PHP Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead) in /home/index.php on line 2
Guarda antes el resultado en una variable, o comprueba el propio valor: null !== $expr, como sugiere el mensaje, o trim($input) !== "" para una cadena.
Preguntas frecuentes
¿Qué hace isset() en PHP?
isset($x) devuelve true si $x existe y no es null, y false en caso contrario. Nunca genera un warning por una variable o una clave de array no definidas, así que es segura con los datos de la petición, como isset($_POST['email']).
¿Cuál es la diferencia entre isset() y empty() en PHP?
isset() pregunta "¿existe y no es null?"; empty() pregunta "¿falta o es falsy?". Con 0, "", "0" y [], isset() devuelve true y empty() también devuelve true. Con null o una clave que falta, isset() es false y empty() es true. !empty($x) equivale a que isset($x) && $x sea truthy.
¿Puede isset() comprobar varias variables?
Sí: isset($a, $b, $c) devuelve true solo si todas están definidas y no son null. Se detiene en la primera que no lo esté.
¿Uso isset() o array_key_exists()?
Solo se diferencian cuando la clave existe con el valor null: isset($arr['k']) devuelve false y array_key_exists('k', $arr) devuelve true. Usa array_key_exists cuando null sea un valor guardado con significado; si no, isset es más corto y algo más rápido.