【问题标题】:Shorthand conditional to define a variable based on the existence of another variable in PHP基于 PHP 中另一个变量的存在来定义一个变量的简写条件
【发布时间】:2011-04-13 21:35:08
【问题描述】:

本质上,我希望能够将变量定义为一个事物,除非该事物不存在。我发誓在某处我看到了一个类似这样的速记条件:

$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 开始做到这一点?
  • @DominicTobias 接受的答案适用于 5.3+
  • @MatthijsWessels 这个问题是询问如何最好地默认一个可能设置的变量。我要求一个特定的操作员获取一个变量(不一定是同一个变量)并回退到另一个。每个问题的公认答案都反映了这种差异。它们是相似但不同的问题,接受的答案不同,我认为不需要对这个问题进行任何修改。
  • 嗯,在阅读了 Ruby 中的条件赋值到底是什么(另一个问题因为重复而被关闭)之后,我想有一个细微的差别。

标签: php variables conditional shorthand


【解决方案1】:

在这种情况下,您应该检查 $_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,这应该是公认的答案。它有点长,但它避免了警告。此外,对 !== '' 的检查并不是真的存在,尽管它可能对某些情况有用。
  • @MatthewFlaschen 这实际上并没有回答我的问题。它引起了合理的担忧,所以我赞成它。但问题是是否有办法完成你所做的事情,简写。
【解决方案2】:

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

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

这不等于:

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

原因是 PHP 在这方面和大多数传统语言一样。逻辑 OR 始终返回 truefalse。但是,在 JavaScript 中,使用了最终表达式。 (在一系列 OR 中,它将是第一个非假的。)

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

【讨论】:

  • 其他 Matthew 删除了他的答案,因为他不喜欢这个答案没有遵循他个人的最佳实践,所以他删除了它。因此,我将其标记为正确,因为它扩展了原始答案。作为记录,其他 Matthew 的担忧在 Fanis 的回答中表达了。它们是有效的担忧,但我的问题的答案实际上是?:,如此处所示。
【解决方案3】:

我一直用空的。

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

【讨论】:

  • 我想如果你使用 $_GET,你将永远不会得到布尔响应,所以 emptyisset 无法区分,但在其他情况下这似乎是一种更糟糕的方法:$var = !empty($other_var)?$other_var:true 将使 $var always 等于 true。虽然,我猜,JS 符号 var = other_var || true 也是如此。
猜你喜欢
  • 2022-11-23
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 2019-09-01
相关资源
最近更新 更多