2

我正在尝试将 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

4 回答 4

3

isset并且empty不是函数,它们是语言结构。因此,他们可以摆脱诸如读取文字变量名之类的事情,而不是尝试访问该值。您定义的任何功能都无法做到这一点。

考虑到这一点,无需对两者进行测试。empty是 的超集isset,因此您只需要检查empty.

于 2013-03-05T17:27:48.157 回答
2

您的功能几乎等同于!empty

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

唯一的区别是:如果你的包装函数传递了一个不存在的变量,你的包装函数会报错——而语言结构 empty不会(也不会isset)。

您的子问题

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

可能是因为您关闭了错误报告。

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

是的。

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

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

于 2013-03-05T17:28:20.813 回答
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';
}
于 2013-03-05T18:16:03.697 回答
0

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

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

这会给你:

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

空值

但如果你这样做:

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

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

你会得到:

空值

这是因为在内部 $var 变量将在函数被调用的那一刻被创建。但是由于 $_SESSION['something'] 不存在,因此 $var 被设置为 null 然后返回。瞧,通知不见了。但请注意,变量 $_SESSION['something'] 现在已在内部创建,即使 isset($_SESSION['something']) 仍将返回 false,因为 isset 确定“是否设置了变量并且不是NULL ”。

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

于 2016-06-08T12:00:41.243 回答