在PHP中,使用简写条件语句根据另一个变量的存在来定义一个变量

19

基本上,我希望能够定义一个变量作为一个东西,除非那个东西不存在。我发誓在某个地方看到过一种类似于以下内容的简写条件语句:

$var=$_GET["var"] || "default";

但我找不到任何正确的文档来做这件事,而且老实说,可能是在我看到它的地方使用了JS或ASP之类的东西。

我理解以上代码应该只是检查两个语句是否返回true。但我记得曾经有人做过一些事情,如果第一个失败就定义了一个默认值。这是有人知道并能帮助我的吗?难道我疯了吗?这似乎是重复的:

$var=($_GET["var"]) ? $_GET["var"] : "default";

或者特别冗余地说:

if ($_GET["var"]) { $var=$_GET["var"]; } else { $var="default"; }

有什么想法?


是的,这很愚蠢,PHP不能做到这一点,有人知道它在5.6版本中是否可以实现吗? - Dominic
1
@DominicTobias 接受的答案适用于5.3+版本。 - Ben Saufley
可能是[设置默认值(条件赋值)]的重复问题](https://dev59.com/XHVC5IYBdhLWcg3w2lGI)。 - Matthijs Wessels
@MatthijsWessels 这个问题是在询问如何最好地默认一个可能已设置的变量。我则是在寻求一个特定的运算符来获取一个变量(不一定是同一个变量)并回退到另一个变量。每个问题的被接受答案反映了这种差异。它们是相似但不同的问题,有着不同的被接受答案,我认为这个问题不需要做任何修改。 - Ben Saufley
嗯,在了解 Ruby 中的条件赋值究竟是什么之后(另一个问题被关闭作为重复问题),我猜想有微妙的差别。 - Matthijs Wessels
3个回答

16

Matthew 已经提到了在 PHP 5.3 中唯一的方法。请注意,您也可以将它们链接起来:

$a = false ?: false ?: 'A'; // 'A'

这不同于:

$a = false || false || 'A'; // true

之所以如此,是因为PHP在这方面和大多数传统语言一样。逻辑或(OR)操作符总是返回truefalse。然而,在JavaScript中,将使用最后一个表达式。(在一系列的OR操作中,它将是第一个非false的表达式。)

var a = false || 'A' || false; // 'A' 
var b = true && 'A' && 'B';    // 'B';

其他的Matthew删除了他的答案,因为他不喜欢这个答案没有遵循他的个人最佳实践,所以他将其删除了。因此,我将其标记为正确答案,因为它扩展了原始答案。值得一提的是,其他Matthew的担忧在Fanis的答案中得到了表达。他们是合理的担忧,但我的问题的答案实际上是?:,如此展示的那样。 - Ben Saufley

8
在这种情况下,您应该检查$_GET中变量的存在性,然后再检查它是否对您的参数有效。例如:
$var = (isset($_GET["var"]) && $_GET['var'] !== '') ? $_GET["var"] : "default";

然而,这样很快就会变得难以阅读。我建议首先将变量初始化为安全的默认值,然后再用外部变量覆盖它,如果外部变量是有效的,以保持可读性:

$var = "default";
if (isset($_GET['var') && $_GET['var'] !== '') {
    $var = $_GET['var] ;
}

关于你提供的第一个例子,$var=$_GET["var"] || "default"; 在JavaScript中也存在:var someVar = incomingVar || "default";


@Ben,这可能是应该被接受的答案。虽然有点长,但避免了警告。此外,对于!===''的检查并不是真正意义上的存在检查,尽管它对某些情况可能有用。 - Matthew Flaschen
@MatthewFlaschen,这并没有真正回答我所提出的问题。它提出了一些合理的担忧,所以我已经点赞了。但问题是是否有一种简写的方法来完成你所做的事情。 - Ben Saufley

3

我一直使用“空”(empty)。

$var = !empty($_GET['var'])?$_GET['var']:'default';

我想,如果您正在使用 $_GET,则永远不会得到布尔响应,因此 emptyisset 不可区分,但在其他情况下,这似乎是更糟糕的做法:$var = !empty($other_var)?$other_var:true 将使 $var 始终 等于 true。虽然,我猜,JS 表示法 var = other_var || true 也是如此。 - Ben Saufley

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