Php 测试可能未设置的变量中的空值
考虑到:Php 测试可能未设置的变量中的空值,php,Php,考虑到: 如果设置了变量且不为NULL,则构造返回TRUE 如果未设置变量,函数将抛出警告 有没有一种方法可以测试变量是否存在,不管它是否为NULL,而不使用@operator来抑制通知 编辑 结合您的第一次回复,我一直在思考这个问题,我得出结论,检查get_defined_vars()是区分设置为NULL的变量和未设置变量的唯一方法。PHP似乎没有什么区别: <?php $exists_and_is_null = NULL; // All these are TRUE @va
- 如果设置了变量且不为NULL,则构造返回TRUE
- 如果未设置变量,函数将抛出警告
编辑 结合您的第一次回复,我一直在思考这个问题,我得出结论,检查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');
?>
这应该可以解决问题。您已经发现,您不能:
$result = array_key_exists('varname', get_defined_vars());
- 依赖于
,因为对于isset
的变量,它返回null
false
- 使用
,因为它会引起一个通知$not\u exists===null
但您可以使用以下组合:
- 要获取现有变量的列表,包括
null
- 并找出该列表中是否存在条目
例如:
$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);
几点注意:
- 在第一种情况下,变量exists=>在由
返回的列表中有一个条目,因此对条件的第二部分进行评估get\u defined\u vars
- 条件的两个部分都是
true
- 条件的两个部分都是
- 在第二种情况下,变量也存在,但为null
- 这意味着条件的第一部分是
,而第二部分是true
false
- 所以整个表达式是
false
- 这意味着条件的第一部分是
- 在第三种情况下,变量不存在,
- 这意味着条件的第一部分是
false
- 条件的第二部分没有被评估——这意味着它不会引起通知
- 这意味着条件的第一部分是
但请注意,如果您关心性能,这可能不是一个好主意:
isset
是一种语言构造,而且速度很快——而调用get\u defined\u vars
可能要慢得多^^ ^我使用了一个自创函数来轻松检查这一点,请记住它会发出PHP警告(我只在开发时监视E_错误)
我在这里认为,任何需要这种比较的代码都会得到错误的语义;NULL是一个未设置的值,在一种语言中,它无法直接区分两者。当$var为NULL时,此条件为FALSE使用
打印“$var为NULL”
消除了将$var作为单个qu转义的需要OTE没有被评估。它仍然是一个字符串值。请将这个问题读几遍……他所寻找的东西并不明显,而且比第一次出现的要困难得多。可能不是最优的,但分析起来非常巧妙。实际上,使用@看起来是最好的选择。谢谢:-);;;实际上,我想说的是,通常不需要区分“不存在”和“为空”:在大多数情况下,使用isset
应该很好。在(例如)有一个未设置的$phone_号码(用户没有提供他的号码)和代码中有一个类似$fone_的打字错误之间是有区别的。我发现以不同的方式处理这两种情况并没有什么错,而且我觉得它和PHP的区别非常小。看看SQL:一个空值的行和一个不存在的行是不同的,当然有。但是,请尝试向PHP解释这一点。甚至不要让我开始无法捕捉简单的错误,例如输入错误(读取未设置的变量)或传递错误数量的参数…这里-现在第二句要强调得多。可以使用适当的数组\u filter()、is\u null等来清理此代码,但我不会在这里不测试它的情况下执行此操作,所以我将把这个作为一个工作示例。
$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);
function isNullOrEmpty( $arg )
{
if ( !is_array( $arg ) )
{
$arg = array( $arg );
}
foreach ( $arg as $key => $value )
{
if( $value == null || trim($value) == "" )
{
return true;
}
}
return false;
}