Check if value isset and null

匿名 (未验证) 提交于 2019-12-03 07:36:14

问题:

I need to check if value is defined as anything, including null. isset treats null values as undefined and returns false. Take the following as an example:

$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

Note that $bar is undefined.

I need to find a condition that satisfies the following:

if(something($bar)) // returns false; if(something($foo)) // returns true;

Any ideas?

回答1:

IIRC, you can use get_defined_vars() for this:

$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


回答2:

If you are dealing with object properties whcih might have a value of NULL you can use: property_exists() instead of isset()

As opposed with isset(), property_exists() returns TRUE even if the property has the value NULL.



回答3:

See Best way to test for a variable's existence in PHP; isset() is clearly broken

 if( array_key_exists('foo', $GLOBALS) && is_null($foo)) // true & true => true  if( array_key_exists('bar', $GLOBALS) && is_null($bar)) // false &  => false


回答4:

I have found that compact is a function that ignores unset variables but does act on ones set to null, so when you have a large local symbol table I would imagine you can get a more efficient solution over checking array_key_exists('foo', get_defined_vars()) by using 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


回答5:

The following code written as PHP extension is equivalent to array_key_exists($name, get_defined_vars()) (thanks to Henrik and 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;     }  }


回答6:

You could use is_null and empty instead of isset(). Empty doesn't print an error message if the variable doesn't exist.



回答7:

Here some silly workaround using 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


回答8:

is_null($bar) returns true, since it has no values at all. Alternatively, you can use:

if(isset($bar) && is_null($bar)) // returns false

to check if $bar is defined and will only return true if:

$bar = null; if(isset($bar) && is_null($bar)) // returns true


转载请标明出处:Check if value isset and null
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!