【问题标题】:PHP: do this || that (like javascript)PHP:这样做 ||那个(像javascript)
【发布时间】:2015-05-29 00:47:13
【问题描述】:

在 javascript 中,如果第一个操作失败,我们可以使用 || 执行第二个操作,例如:

function getObject(id_or_object) {
    var obj = document.getElementById(id_or_object) || id_or_object;
    return obj;
}

我们如何在 PHP 中做到这一点?

如果我们不能,我可以发誓我在 PHP 中看到过这样使用 ||。什么意思?

我想做:

function fix_item($item) {
    $item['armor'] = $item['armor'] || 0;
    return $item;
}

但这不起作用,所以我正在使用

function fix_item($item) {
    if (!isset($item['armor'])) $item['armor'] = 0;
    return $item;
}

,但我不喜欢第二种方法.. 有什么想法吗?

【问题讨论】:

    标签: javascript php short shorthand


    【解决方案1】:

    您可以使用|| (OR) 进行真/假比较,但是(这是 PHP 设计中已知的(可争论的)设计错误之一):短路不返回操作数的值(如你在你的 javascript-logic 例子中做的)但是布尔结果。

    这意味着:
    $item['armor'] = $item['armor'] || 0; 无法按您的预期工作(就像在 javascript 中一样)。
    相反,它会将$item['armor'] 设置为布尔真/假(取决于:$item['armor'] || 0 的结果)。

    但是,可以以与在 javascript 中使用类似的方式使用“惰性求值”:
    isset($item['armor']) || $item['armor'] = 0;
    (添加了isset 以防止出现Undefined variable 错误)。
    它仍然清楚地描述了您的意图,并且您不需要使用 ! 反转布尔值 isset 结果(这对于 if&& (AND) 来说是必要的)。

    或者,也可以这样做:
    $item['armor'] = $item['armor'] OR $item['armor'] = 0;(请注意,这将给出E_NOTICE
    (我觉得可读性不太好),

    或三元:
    $item['armor'] = isset($item['armor']) ? $item['armor'] : 0;
    (具有“更好”/“更常见”的可读性,但增加了代码大小)。

    对于 PHP7 及更高版本,请参阅 Tom DDD 的答案。

    【讨论】:

      【解决方案2】:

      如果你使用的是 php 7,你可以使用 null coalesce 操作符

      $a ?? $b ?? $c 
      

      this 计算为第一个非空值。这与 || 非常相似来自 javascript。

      【讨论】:

      • PHP 7 尚未正式发布。
      【解决方案3】:

      这会测试 $item['armor'],如果它是 true,它会返回 ? 右侧的内容。运算符,如果为 false,则返回 : 右侧的内容(我也在 javascript 中使用过三元运算符)。

      function fix_item($item) {
          $item['armor'] = $item['armor'] ? $item['armor'] : 0;
          return $item;
      }
      

      【讨论】:

      • 你在某处错过了:
      • 你完全正确!function fix_item($item) { $item['armor'] = $item['armor'] ? $item['盔甲'] : 0;返回$项目; }
      • 那么为什么不修正答案呢?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多