简单的PHP isset测试

29

尽管 $_GET['friendid'] = 55,但下面的代码似乎没有按照我的期望工作,它返回了 NULL。

<?PHP

$_GET['friendid'] = 55;

$friendid = (!isset($_GET['friendid'])) ? $_GET['friendid'] : 'empty';

echo $friendid;
exit;

?>

5
应该输出“empty”,因为您在三元运算符中的表达式顺序是颠倒的。 - Brian Ramsay
10个回答

69

自从PHP 7发布以来,您可以使用null合并运算符(双“?”)来实现此操作:

$var = $array["key"] ?? "default-value";
// which is synonymous to:
$var = isset($array["key"]) ? $array["key"] : "default-value";

在PHP 5.3+中,如果你只是检查一个“truthy”值,你可以使用“Elvis操作符”(请注意,这不检查isset)。
$var = $value ?: "default-value";
// which is synonymous to:
$var = $value ? $value : "default-value";

5
?:-) 嗯嗯嗯 - Greg

53

去掉!,你不想否定表达式。

$friendid = isset($_GET['friendid']) ? $_GET['friendid'] : 'empty';

好的,这个可以工作,然而我不明白为什么会这样,$_GET['friendid'] = ''; 并没有显示为空,难道这不应该被视为null值吗? - JasonDavis
'' 是一个空字符串,但变量仍然被设置了。 - Joseph Mansfield
4
这与吸气无关,而是因为一个变量可以被声明($var),也可以被初始化($var = 'bla')。未声明的变量和被声明但初始化为空字符串的变量并不相同。 - Philippe Gerber

11

1
我来这里是为了寻找答案中发布的控制结构的简化形式,而你的完美无缺。谢谢。 - Aditya M P
2
只是需要注意的是,这种解决方案速度较慢,可能会干扰(编写不良的)自定义错误处理程序等,并且 if 语句执行速度更快。但这并不意味着它是邪恶的。 - thomasrutter

6

目前你正在使用三元运算符:

$friendid = (!isset($_GET['friendid'])) ? $_GET['friendid'] : 'empty';

将其转化为if-else语句,代码如下:
if(!isset($_GET['friendid']))
   $friendid = $_GET['friendid'];
else
   $friendid = 'empty';

看看在 if 语句中实际发生了什么:

!isset($_GET['friendid'])

请注意isset函数前面的感叹号(!)。这是另一种表达“相反”的方式。你在这里检查的是$_GET['friendid']是否已经设置了值。如果没有,$friendid将采用该值。
但实际上,它会出错,因为$_GET['friendid']甚至不存在。你不能取一个不存在的东西的值。
从一开始,你为$_GET['friendid']设置了一个值,所以第一个if条件现在是false,并将其传递给else选项。
在这种情况下,将$friendid变量的值设置为空。
你想要的是去掉感叹号,然后$friendid的值将采用$_GET['friendid']的值(如果之前已经设置)。

4

对于这个问题,最好的解决方案是使用 empty() 函数,它可以检查字符串是否为空。

$friendid = empty($_GET['friendid']) ? 'empty' : $_GET['friendid'];

empty() 不仅检查变量是否被设置,而且如果它被提供任何可以被认为是“空”的内容,如空字符串、空数组、整数0、布尔值false等,则还会返回false。


1
从您对Philippe的回复中,我认为您需要了解emptyisset之间的区别。
简而言之,isset()将返回布尔值TRUE,如果变量存在。因此,如果您要执行
$fid = $_GET['friendid'] = "";
$exists = isset($fid);

$exists 将会是 TRUE,因为 $_GET['friendid'] 存在。如果这不是你想要的,我建议你查看 empty。Empty 会在空字符串("")上返回 TRUE,这似乎是你期望的结果。如果你使用 empty,请参考我链接的文档,其中还有其他情况,empty 会返回 true,而你可能没有预料到,这些情况在上面的链接中有明确的文档记录。


1
我正在使用空值合并运算符在if条件中,用法如下。
if($myArr['user'] ?? false){

等同于

if(isset($myArr['user']) && $myArr['user']){

0

好的,我可能遇到了与jasondavis类似的问题,不熟悉!的情况。

有点令人困惑,但是发现没有!,例如...isset($avar)与!isset($avar)相比,可能会产生很大的差异。

因此,有了!,更多地是表示YES,例如

    since $_GET['friendid'] = 55; has been initialized...
                                tell me 'no' - the opposite - that it hasn't and set it to empty.
              $friendid = (!isset($_GET['friendid'])) ? $_GET['friendid'] : 'empty';

    where not having the ! tells me yes it has something in it, leave it be.

               $friendid = (!isset($_GET['friendid'])) ? $_GET['friendid'] : 'empty';

如果 A$="",那么使用 if A$="" then.... 会更加清晰易懂(或者对于 PHP 来说,使用 if $A="")。

我有时候觉得将所有的字符串和变量都作为字符串使用非常令人望而生畏。尽管如此,我实际上可以理解为什么要这样做...只是让我有些难以理解。


0
对于我来说,如果我需要知道两个条件都成立的话:
1. 键已设置 2. 值为真值
如果条件不成立,则使用另一个结果:
最简单的方式是: ``` $result = ($arr['b'] ?? 0) ?: $arr['a']; ```
也就是说,如果`b`已设置并且具有实际值,则使用它。否则使用`a`。
所以在这种情况下: ``` $arr = ['a' => 'aaa', 'b' => 'bbb']; ```
`$result`的值将会是`aaa`。

0

如果friendid未设置,则friendid = friendid,否则friendid为空


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接