为什么trim()会使一个不存在的变量存在?

时间:2014-01-05 10:41:42

标签: php

我有以下代码:

$a=$_POST['dsaghgjjkhfdsfdsfsdfdsjhkhkhgj'];

if(isset($a))
{
    echo"exists";
}
else
{
    echo"does not exist";
}

回显“不存在”的值,但是当我将trim应用于$ _POST变量时,

$a=trim($_POST['dsaghgjjkhfdsfdsfsdfdsjhkhkhgj']);

if(isset($a))
{
    echo"exists";
}
else
{
    echo"does not exist";
}

代码将回显“存在”。为什么将一个不存在的$ _POST变量传递给trim()会神奇地使它存在?

4 个答案:

答案 0 :(得分:4)

这正是一步一步发生的事情。

当您在第二个代码段中引用$_POST['...']时,会发出此通知:

  

注意:未定义的索引:......在线...

由于error_reporting级别不包含E_NOTICE,您无法收到通知。评估中间$_POST['...'] NULLtrim(NULL)返回空字符串。因此为$a分配了一个空字符串。

如果您在脚本中添加error_reporting(E_ALL)ini_set("display_errors", "on"),则会看到发出的实际错误/警告/通知。

答案 1 :(得分:3)

因为trim返回一个字符串,无论其输入如何,请参阅http://ch2.php.net/manual/en/function.trim.php

php > var_dump(NULL);
NULL
php > var_dump(trim(NULL));
string(0) ""

字符串,即使它是空的,也被声明为“已定义”。这就是isset然后返回true的原因。

答案 2 :(得分:2)

这是isset的作用:

  

如果 var 存在并且其值不是TRUE,则返回NULL,否则为FALSE

在第一个示例中,$_POST变量不存在。 Non-existing variables have the value null

  

如果符合以下情况,则变量被视为 null

     
      
  • 已为其分配常量NULL
  •   
  • 尚未设置为任何值。
  •   
  • 已经unset()
  •   

所以$a也等于null。虽然$a存在,但其值为null,因此isset会返回false

在第二个示例中,null传递给trim,后者返回一个空字符串:

var_dump(trim(null)); // string(0) ""

所以$a也等于一个空字符串。由于$a存在并且其值不是nullisset会返回true

答案 3 :(得分:1)

您可以尝试empty()功能。 trim()返回一个空字符串!= NULL:

$a=trim($_POST['dsaghgjjkhfdsfdsfsdfdsjhkhkhgj']);

if(empty($a))
{
    echo"does not exist";
}
else
{
    echo"exists";
}

来自php.net:

以下内容被认为是空的:

"" (an empty string)
0 (0 as an integer)
0.0 (0 as a float)
"0" (0 as a string)
NULL
FALSE
array() (an empty array)
$var; (a variable declared, but without a value)