考虑到:
有没有办法测试变量是否存在,无论是否为NULL,而不使用@运算符来抑制通知?
修改
与你的第一个回复一起,我一直在考虑这个问题,我得出结论,检查get_defined_vars()是区分变量设置为NULL和未设置变量的唯一方法。 PHP似乎没什么区别:
<?php
$exists_and_is_null = NULL;
// All these are TRUE
@var_dump(is_null($exists_and_is_null));
@var_dump(is_null($does_not_exist));
@var_dump($exists_and_is_null===NULL);
@var_dump($does_not_exist===NULL);
@var_dump(gettype($exists_and_is_null)=='NULL');
@var_dump(gettype($does_not_exist)=='NULL');
?>
答案 0 :(得分:5)
$result = array_key_exists('varname', get_defined_vars());
答案 1 :(得分:0)
正如您已经发现的那样,您不能:
isset
,因为它会为false
的变量返回null
。$not_exists===null
,因为它会发出通知。
但是你可以使用以下组合:
get_defined_vars
获取现有变量列表,包括null
,array_key_exists
以确定该列表中是否存在条目。
例如:
$exists_and_null = null;
$exists_and_not_null = 10;
$defined_vars = get_defined_vars();
// true
var_dump(array_key_exists('exists_and_null', $defined_vars)
&& $defined_vars['exists_and_null']===null);
// false
var_dump(array_key_exists('exists_and_not_null', $defined_vars)
&& $defined_vars['exists_and_not_null']===null);
// false
var_dump(array_key_exists('not_exists', $defined_vars)
&& $defined_vars['not_exists']===null);
几个笔记:
get_defined_vars
返回的列表中有一个条目,因此评估条件的第二部分
true
true
,但第二部分为false
,false
。false
,但请注意,这可能不是一个好主意,如果你关心表演:isset
是一种语言结构,并且很快 - 而调用get_defined_vars
可能要慢得多^^
答案 2 :(得分:0)
我使用自己创建的函数来轻松检查,请记住它会触发PHP警告(我在开发时只监视E_ERROR)。
function isNullOrEmpty( $arg )
{
if ( !is_array( $arg ) )
{
$arg = array( $arg );
}
foreach ( $arg as $key => $value )
{
if( $value == null || trim($value) == "" )
{
return true;
}
}
return false;
}
答案 3 :(得分:0)
我认为,任何需要这种比较的代码都会使其语义错误; NULL 是语言中的未设置值,没有直接的方法来区分两者。
答案 4 :(得分:-2)
if (isset($var) && (is_null($var)) {
print "\$var is null";
}
这应该可以解决问题。