Necesito verificar si el valor está definido como algo, incluido nulo. issettrata 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 $barno 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 TRUEfuente
get_defined_varsfelizmente 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 & => falsefuente
Descubrí que
compactes 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'; // falseActualizar
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 sifooexiste 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_nulltiene el mismo problema queis_set: no puede distinguir entre "no establecido" y "establecido en nulo", que es el problema que tiene OP.emptyes 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')); // -> falsefuente
is_null($bar)devuelve verdadero, ya que no tiene ningún valor. Alternativamente, puede utilizar:if(isset($bar) && is_null($bar)) // returns falsepara verificar si
$barestá definido y solo devolverá verdadero si:$bar = null; if(isset($bar) && is_null($bar)) // returns truefuente
if(isset($bar))da falso cuando$bar = null.$bar = "test").isset($bar)devuelve falso, incluso después$bar = null;.