validar - php is null or empty
Compruebe si el valor es isset y nulo (8)
Aquí 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
Necesito verificar si el valor se define como cualquier cosa, incluso nulo. isset
trata los valores nulos como indefinidos y devuelve false
. Tome lo siguiente como un 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?
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;
}
}
He descubierto que compact
es una función que ignora las variables no establecidas, pero actúa sobre las establecidas como null
, por lo que cuando se tiene una tabla de símbolos local grande me imagino que se puede obtener una solución más eficiente que verificar array_key_exists(''foo'', get_defined_vars())
mediante el uso de array_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
IIRC, puede usar 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
Si está tratando con propiedades de objetos que pueden tener un valor de NULL, puede usar: property_exists()
lugar de isset()
<?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();
?>
A diferencia de isset (), property_exists () devuelve TRUE incluso si la propiedad tiene el valor NULL.
Vea la 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
is_null($bar)
devuelve verdadero, ya que no tiene ningún valor. Alternativamente, puede usar:
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