Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 测试可能未设置的变量中的空值_Php - Fatal编程技术网

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
  • 如果未设置变量,函数将抛出警告
有没有一种方法可以测试变量是否存在,不管它是否为NULL,而不使用@operator来抑制通知


编辑

结合您的第一次回复,我一直在思考这个问题,我得出结论,检查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;
    }