Necesito verificar si el valor está definido como algo, incluido nulo. isset
trata los valores nulos como indefinidos y devuelve false
. Tome lo siguiente como ejemplo:
$foo = null;
if(isset($foo)) // returns false
if(isset($bar)) // returns false
if(isset($foo) || is_null($foo)) // returns true
if(isset($bar) || is_null($bar)) // returns true, raises a notice
Tenga en cuenta que $bar
no está definido.
Necesito encontrar una condición que satisfaga lo siguiente:
if(something($bar)) // returns false;
if(something($foo)) // returns true;
¿Algunas ideas?
isset
= ¿está establecido ?, su variable está establecida en nulo. Perdí mucho tiempo por esto ...Respuestas:
IIRC, puede utilizar
get_defined_vars()
para esto:$foo = NULL; $vars = get_defined_vars(); if (array_key_exists('bar', $vars)) {}; // Should evaluate to FALSE if (array_key_exists('foo', $vars)) {}; // Should evaluate to TRUE
fuente
get_defined_vars
felizmente afronta el alcance.get_defined_vars()
:array_key_exists('foo', compact('foo'))
. O más rápido, si la prueba de un mundial:array_key_exists('foo', $GLOBALS)
.Si está tratando con propiedades de objeto que podrían tener un valor de NULL, puede usar: en
property_exists()
lugar deisset()
<?php class myClass { public $mine; private $xpto; static protected $test; function test() { var_dump(property_exists($this, 'xpto')); //true } } var_dump(property_exists('myClass', 'mine')); //true var_dump(property_exists(new myClass, 'mine')); //true var_dump(property_exists('myClass', 'xpto')); //true, as of PHP 5.3.0 var_dump(property_exists('myClass', 'bar')); //false var_dump(property_exists('myClass', 'test')); //true, as of PHP 5.3.0 myClass::test(); ?>
fuente
Consulte Mejor forma de probar la existencia de una variable en PHP; isset () está claramente roto
if( array_key_exists('foo', $GLOBALS) && is_null($foo)) // true & true => true if( array_key_exists('bar', $GLOBALS) && is_null($bar)) // false & => false
fuente
Descubrí que
compact
es una función que ignora las variables no configuradas pero actúa sobre las configuradasnull
, por lo que cuando tiene una tabla de símbolos local grande, me imagino que puede obtener una solución más eficiente que la verificaciónarray_key_exists('foo', get_defined_vars())
usandoarray_key_exists('foo', compact('foo'))
:$foo = null; echo isset($foo) ? 'true' : 'false'; // false echo array_key_exists('foo', compact('foo')) ? 'true' : 'false'; // true echo isset($bar) ? 'true' : 'false'; // false echo array_key_exists('bar', compact('bar')) ? 'true' : 'false'; // false
Actualizar
A partir de PHP 7.3 compact () dará un aviso de valores no establecidos, por lo que desafortunadamente esta alternativa ya no es válida.
fuente
compact
. Sin embargo, lo voté a favor porque es útil en una situación: si desea saber sifoo
existe en el contexto actual , independientemente de dónde venga , si no le importa si es local o global, solo quiere saber si existe.get_defined_vars
. Vea aquí .El siguiente código escrito como extensión PHP es equivalente a array_key_exists ($ name, get_defined_vars ()) (gracias a Henrik y Hannes).
// get_defined_vars() // https://github.com/php/php-src/blob/master/Zend/zend_builtin_functions.c#L1777 // array_key_exists // https://github.com/php/php-src/blob/master/ext/standard/array.c#L4393 PHP_FUNCTION(is_defined_var) { char *name; int name_len; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &name_len) == FAILURE) { return; } if (!EG(active_symbol_table)) { zend_rebuild_symbol_table(TSRMLS_C); } if (zend_symtable_exists(EG(active_symbol_table), name, name_len + 1)) { RETURN_TRUE; } }
fuente
Puede usar is_null y empty en lugar de isset (). Empty no imprime un mensaje de error si la variable no existe.
fuente
isset
.is_null
tiene el mismo problema queis_set
: no puede distinguir entre "no establecido" y "establecido en nulo", que es el problema que tiene OP.empty
es incluso peor, como señala Calum.Aquí hay una solución tonta usando xdebug. ;-)
function is_declared($name) { ob_start(); xdebug_debug_zval($name); $content = ob_get_clean(); return !empty($content); } $foo = null; var_dump(is_declared('foo')); // -> true $bla = 'bla'; var_dump(is_declared('bla')); // -> true var_dump(is_declared('bar')); // -> false
fuente
is_null($bar)
devuelve verdadero, ya que no tiene ningún valor. Alternativamente, puede utilizar:if(isset($bar) && is_null($bar)) // returns false
para verificar si
$bar
está definido y solo devolverá verdadero si:$bar = null; if(isset($bar) && is_null($bar)) // returns true
fuente
if(isset($bar))
da falso cuando$bar = null
.$bar = "test"
).isset($bar)
devuelve falso, incluso después$bar = null;
.