我试图在函数中封装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参数来获取通知?
答案 0 :(得分:3)
isset
和empty
不是函数,它们是语言结构。因此,他们可以逃避阅读文字变量名称而不是尝试访问该值。您定义的任何功能都无法做到。
考虑到这一点,没有必要对两者进行测试。 empty
是isset
的超集,因此您只需要检查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