PHP: ¿Asignar nulo si no está configurado?

3 minutos de lectura

avatar de usuario
Pedro

¿Hay algún tipo de función de asignación-si-no-vacía-de lo contrario-asignar-nulo en PHP?

Estoy buscando una alternativa más limpia a la siguiente:

$variable = (!empty($item)) ? $item : NULL;

También sería útil si pudiera especificar el valor predeterminado; por ejemplo, a veces me gustaría ‘ ‘ en lugar de NULL.

Podría escribir mi propia función, pero ¿hay una solución nativa?

¡Gracias!

EDITAR: Cabe señalar que estoy tratando de evitar un aviso de valores indefinidos.

  • !empty($elemento) && ($variable = $elemento);

    – Delta

    14 de enero de 2011 a las 22:05

  • @Delta: ¿Qué sucede entonces con el valor predeterminado?

    – BoltClock

    14 de enero de 2011 a las 22:06

  • @Delta Eso no funciona, no se inicializará $variable cuando $item esta vacio.

    – usuario229044

    14 de enero de 2011 a las 22:06

avatar de usuario
Pedro

Actualizar

PHP 7 agrega una nueva característica para manejar esto.

El operador coalescente nulo (??) se ha agregado como azúcar sintáctico para el caso común de necesitar usar un ternario junto con isset(). Devuelve su primer operando si existe y no es NULL; de lo contrario, devuelve su segundo operando.

<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';

Además, desde 7.4 para la misma variable puede ser aún más corto:

$variable ??= null;
// This is equivalent to:
$variable = $variable ?? null;

mantendrá el valor existente si lo hubiere, o asignará null si $variable no se configuró.

Respuesta Original

Terminé simplemente creando una función para resolver el problema:

public function assignIfNotEmpty(&$item, $default)
{
    return (!empty($item)) ? $item : $default;
}

Tenga en cuenta que $ artículo es pasado por referencia a la función.

Ejemplo de uso:

$variable = assignIfNotEmpty($item, $default);

  • La referencia es necesaria en la definición de la función, no en la llamada a la función. $variable = assignIfNotEmpty($item, $default); todavía recibe $item por referencia. Ver php.net/manual/en/language.references.pass.php

    – elreimundo

    11 de diciembre de 2014 a las 21:17


  • @elreimundo: Gracias. Editado.

    – Pedro

    12 de diciembre de 2014 a las 4:03

  • Estos dos fragmentos de código no son iguales. asignar si no está vacío (0, $ predeterminado); devolverá $predeterminado mientras $nombre de usuario = 0 ?? ‘nadie’; devolverá 0

    – Tu sentido común

    25 de julio a las 15:37

avatar de usuario
PernoReloj

Re editar: desafortunadamente, ambos generan avisos sobre variables indefinidas. Podrías contrarrestar eso con @Supongo.

En PHP 5.3 puedes hacer esto:

$variable = $item ?: NULL;

O puedes hacer esto (como dice meagar):

$variable = $item ? $item : NULL;

De lo contrario no, no hay otra manera.

  • No sabía eso sobre PHP 5.3. ¡Eso ciertamente es más limpio!

    – Pedro

    14 de enero de 2011 a las 22:04

  • Haz esto (?:) genera un aviso si no está definido ?

    – Ish

    14 de enero de 2011 a las 22:07


  • Ish, me gustaría saber esto también. Eso es lo que estoy tratando de evitar.

    – Pedro

    14 de enero de 2011 a las 22:09

  • @Ish Kumar: Desafortunadamente sí.

    – BoltClock

    14 de enero de 2011 a las 22:09

  • Supongo $variable = @$item ?: NULL; sería mejor

    – Ish

    14 de enero de 2011 a las 22:14


avatar de usuario
Cenador

Existe el operador de asignación nulo coalescente (??=) que puede ser útil si tiene un valor de parámetro anulable y desea establecer un valor predeterminado si es nulo.

function foo(?Bar $bar): void
{
    $bar ??= new Bar();
}

  • Disponible en PHP 7.4+

    – MingalevME

    15 de diciembre de 2021 a las 9:13

Bueno, sí, hay una solución nativa para asignar el valor o NULL cuando la variable no estaba configurada:

$variable = $possibly_unset_var;

Si solo desea suprimir el aviso (que no resuelve nada ni hace que el código sea más limpio), también hay una sintaxis nativa para eso.

$variable = @$unset_var;

No recomendaría esto en un sistema de producción, pero:

<?php
//$value=1;
[email protected]$value ?:null;
var_dump($item); // NULL
?>

<?php
$value=1;
[email protected]$value ?:null;
var_dump($item); // 1
?>

¿Ha sido útil esta solución?