php测试函数中的isset()和empty()

时间:2013-03-05 17:24:55

标签: php isset

我试图在函数中封装isset()和empty()。

它在我的家庭开发服务器上工作正常(apache 2.4.3,WinXP下的PHP 5.2.17)。当我将它移植到运行Fedora的大学Linux机器上时,我收到了关于未定义索引的通知。

我在家用电脑上检查了我的php.ini,并将错误报告设置为全部。我把error_reporting(E_ALL);在我的PHP脚本中尝试复制错误。它没有发生。

问题1:为什么我没有收到家用开发计算机上的通知?

这是我的功能:

<?php
function there($s) {
    if (! isset($s)) {
        return false;
        }
    if (empty($s)) {
        return false;
        }
    return true;
}
?>

这里我测试会话变量是否存在:

if (! there($_SESSION['u'])) {
    $_SESSION['u'] = new User();
    }

我切换了我的函数,以便在测试isset()之前测试empty(),这样会避免收到通知。我还没有机会在学校测试这个。

问题2:如果变量未定义或未设置,empty()通常会避免发出通知吗?

问题3:我可以使用我的there()函数来执行此操作,还是仅通过传递undefined或unset参数来获取通知?

4 个答案:

答案 0 :(得分:3)

issetempty不是函数,它们是语言结构。因此,他们可以逃避阅读文字变量名称而不是尝试访问该值。您定义的任何功能都无法做到。

考虑到这一点,没有必要对两者进行测试。 emptyisset的超集,因此您只需要检查empty

答案 1 :(得分:2)

您的功能几乎相当于!empty

if (empty($_SESSION['u'])) {
    $_SESSION['u'] = new User();
}

唯一的区别是:如果传递了一个不存在的变量,你的包装函数会抱怨 - 而作为语言构造 empty则不会(而且{{} 3}})。

您的子问题

  

为什么我没有在家用开发计算机上收到通知?

可能是因为你关掉了isset

  

如果变量未定义或未设置,那么empty()通常会避免发出通知吗?

  

我可以使用我的there()函数来执行此操作,还是仅通过传递undefined或unset参数来获取通知?

您将收到有关未定义变量的通知。

答案 2 :(得分:0)

作为一种证明@Kolink真实回复的方式,我还没有意识到......

echo '<form action="" method=POST>
<input type=text value="" name="string" />
<input type=text value=0 name="int" />
<input type=submit />
</form>';

if( empty($_POST['string'] ) ){ 
var_dump( $_POST['string']) ;
}
if( empty($_POST['int'] ) ){ 
var_dump( $_POST['int']) ;
}
if( empty($_POST['something'] ) ){ 
echo 'something was not set, but you cannot var_dump it without a warning';
}

答案 3 :(得分:0)

我意识到这是一个旧线程,它已经有了一个可接受的答案。所以,我不会在这里再回答这些问题。但为了完整起见,并希望它可以帮助别人,我正在分享我使用的东西。 看看下面的代码:

<?php
echo var_dump($_SESSION['something']);

这会给你:

  

PHP注意:未定义的变量:_SESSION in - on line 2

     

NULL

但如果你这样做:

<?php
echo var_dump(mycheck($_SESSION['something']));

function mycheck( &$var ){ // Note the & so we are passing by reference
    return $var;
}

你会得到:

  

NULL

这是因为在调用函数的瞬间内部会创建$ var变量。但由于$ _SESSION ['something']不存在,$ var将被设置为null,然后返回。瞧,通知消失了。但请注意,变量$ _SESSION ['something']现在已在内部创建,即使isset($ _ SESSION ['something'])仍将返回false,因为isset确定'如果变量已设置且不是 NULL ”。

isset的PHP手册:http://php.net/manual/en/function.isset.php