que - El operador de unión nulo de C#(??) en PHP
php operador logico or (6)
Antes de PHP 7, no hay. Si necesita involucrar a isset
, el patrón a usar es isset($var) ? $var : null
isset($var) ? $var : null
. No hay operador ?:
Que incluye las características de isset
.
¿Hay un operador ternario o similar en PHP que actúa como ??
De c#?
??
en C # es limpio y más corto, pero en PHP tienes que hacer algo como:
// This is absolutely okay except that $_REQUEST[''test''] is kind of redundant.
echo isset($_REQUEST[''test''])? $_REQUEST[''test''] : ''hi'';
// This is perfect! Shorter and cleaner, but only in this situation.
echo null? : ''replacement if empty'';
// This line gives error when $_REQUEST[''test''] is NOT set.
echo $_REQUEST[''test'']?: ''hi'';
El wiki.php.net/rfc/isset_ternary , ( ??
) ha sido aceptado e implementado en PHP 7 . Se diferencia del operador ternario corto ( ?:
??
eso ??
suprimirá la E_NOTICE
que de lo contrario ocurriría al intentar acceder a una matriz donde no tiene una clave. El primer ejemplo en el RFC da:
$username = $_GET[''user''] ?? ''nobody'';
// equivalent to: $username = isset($_GET[''user'']) ? $_GET[''user''] : ''nobody'';
Tenga en cuenta que el ??
El operador no requiere la aplicación manual de isset
para evitar la E_NOTICE
.
No existe un operador idéntico a partir de PHP 5.6, pero puede realizar una función que se comporte de manera similar.
/**
* Returns the first entry that passes an isset() test.
*
* Each entry can either be a single value: $value, or an array-key pair:
* $array, $key. If all entries fail isset(), or no entries are passed,
* then first() will return null.
*
* $array must be an array that passes isset() on its own, or it will be
* treated as a standalone $value. $key must be a valid array key, or
* both $array and $key will be treated as standalone $value entries. To
* be considered a valid key, $key must pass:
*
* is_null($key) || is_string($key) || is_int($key) || is_float($key)
* || is_bool($key)
*
* If $value is an array, it must be the last entry, the following entry
* must be a valid array-key pair, or the following entry''s $value must
* not be a valid $key. Otherwise, $value and the immediately following
* $value will be treated as an array-key pair''s $array and $key,
* respectfully. See above for $key validity tests.
*/
function first(/* [(array $array, $key) | $value]... */)
{
$count = func_num_args();
for ($i = 0; $i < $count - 1; $i++)
{
$arg = func_get_arg($i);
if (!isset($arg))
{
continue;
}
if (is_array($arg))
{
$key = func_get_arg($i + 1);
if (is_null($key) || is_string($key) || is_int($key) || is_float($key) || is_bool($key))
{
if (isset($arg[$key]))
{
return $arg[$key];
}
$i++;
continue;
}
}
return $arg;
}
if ($i < $count)
{
return func_get_arg($i);
}
return null;
}
Uso:
$option = first($option_override, $_REQUEST, ''option'', $_SESSION, ''option'', false);
Esto intentaría con cada variable hasta que encuentre una que satisfaga a isset()
:
-
$option_override
-
$_REQUEST[''option'']
-
$_SESSION[''option'']
-
false
Si 4 no estuvieran allí, por defecto sería null
.
Nota: hay una implementación más sencilla que utiliza referencias, pero tiene el efecto secundario de 3v4l.org/9vmFR . Esto puede ser problemático cuando el tamaño o la veracidad de una matriz son importantes.
PHP 7 agrega el operador de unión nula :
// 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'';
También puede buscar una forma breve de escribir el operador ternario de php ?: (Solo php = = 5.3)
// Example usage for: Short Ternary Operator
$action = $_POST[''action''] ?: ''default'';
// The above is identical to
$action = $_POST[''action''] ? $_POST[''action''] : ''default'';
Y su comparación con C # no es justa. "en PHP tiene que hacer algo como": en C # también tendrá un error de tiempo de ejecución si intenta acceder a un elemento de matriz / diccionario que no existe.
Yo uso la función. Obviamente no es un operador, pero parece más limpio que tu enfoque:
function isset_or(&$check, $alternate = NULL)
{
return (isset($check)) ? $check : $alternate;
}
Uso:
isset_or($_REQUEST[''test''],''hi'');
??
Es binario en C #, no ternario. Y no tiene equivalencia en PHP antes de PHP 7.