【问题标题】:PHP equivalent for Ruby's or-equals (foo ||=bar)?PHP 等价于 Ruby 的 or-equals (foo ||=bar)?
【发布时间】:2011-03-22 17:10:00
【问题描述】:

在 PHP 中,我经常写像

这样的行
isset($foo)? NULL : $foo = 'bar'

在 ruby​​ 中有一个很棒的快捷方式,称为 or equals

foo ||= 'bar'

PHP 是否有这样的运算符、快捷方式或方法调用?我找不到,但我可能错过了。

【问题讨论】:

  • 我只想指出这两个例子并不等同。 Ruby 中的 foo ||= 'bar' 更等同于 PHP 中的 isset($foo) && !($foo === false || $foo === NULL) ? NULL : $foo = 'bar'
  • 感谢您指出这一点。实际上,我的 PHP 代码中没有涵盖 $foo 包含“false”或 null 的边缘情况。

标签: php ruby operators


【解决方案1】:

从 PHP7 开始,您可以使用 Null Coalesce Operator:

添加了 coalesce 或 ?? 运算符,如果第一个操作数存在且不为 NULL,则返回第一个操作数的结果,否则返回第二个操作数的结果。

所以你可以写:

$foo = $foo ?? 'bar';

如果设置了 $foo 并且不为 null 或将“bar”分配给 $foo,它将使用 $foo

在旁注中,您使用三元运算符给出的示例实际上应该是:

$foo = isset($foo) ? $foo : 'bar';

三元运算不是 if/else 控制结构的简写,而是 它应该用于根据第三个表达式在两个表达式之间进行选择,而不是选择两个句子或执行路径

【讨论】:

  • 如果他们还添加类似 ??= 的内容会很好
【解决方案2】:

我真的很喜欢 ?: 运算符。不幸的是,它还没有在我的生产环境中实现。所以,如果我要让它看起来像红宝石,我会选择这样的东西:

isset($foo) || $foo = 'bar';

或者,如果您希望它更短(更慢,并且可能产生意想不到的结果):

@$foo || $foo = 'bar';

【讨论】:

  • 第二个中的@运算符是什么?
  • 不幸的是,如果变量未定义,?: 仍然会发出通知。
  • @GrowinMan @ 是 PHP 的 error control operator,忽略错误显示。
【解决方案3】:

您可以创建自己的函数:

function setIfNotSet(&$var, $value) {
    if(!isset($var)) {
        $var = $value;
    }
}

【讨论】:

    【解决方案4】:

    我发现它的可读性、简洁性和高性能:

    isset($foo) or $foo = 'bar';
    

    【讨论】:

      【解决方案5】:

      从 PHP 5.3 开始,可以使用 $foo ?: 'bar' 除非你期望 $foo 是假的

      [编辑]

      算了。如果 $foo 没有设置,它仍然会引发 E_NOTICE。

      【讨论】:

      • 很遗憾这个功能是从php 5.3开始才实现的
      • @Paul Dragoonis,不。 ?: 返回第一部分,如果为假则返回第二部分。 $foo = isset($foo) ?: 'bar'; 会将 $foo 设置为 true(如果已设置),否则将设置为 'bar'(如果未设置)...这是对三元用法的重大疏忽...
      • 我在 PHP RFC wiki 上看到了这个包含在 PHP 5.3 中的帖子,尽管我从来没有使用它来实现 5.2 的向后兼容性。坚持良好的时尚三元:)
      【解决方案6】:

      来自手册:

      从 PHP 5.3 开始,可以省略三元运算符的中间部分。表达式 expr1 ?:如果 expr1 的计算结果为 TRUE,则 expr3 返回 expr1,否则返回 expr3。

      虽然不完全一样。无论如何,希望它有所帮助。

      【讨论】:

        【解决方案7】:

        没有。 According to w3schools,该运算符不存在。

        另外,您发布的 PHP 代码相当神秘。我更喜欢这样的东西:

        if (!isset($foo)) $foo = 'bar';
        

        【讨论】:

        • 我的代码确实很神秘,这正是我寻找更清洁方法的原因:)。
        【解决方案8】:

        与ruby最相似的是这个:

        $foo or $foo = 'bar';
        

        如果

        ,$foo 为假
        $foo = 0;
        $foo = '0';
        $foo = NULL;
        $foo = '';
        $foo = array();
        $foo = FALSE;
        

        【讨论】:

        • isset($foo) or $foo = 'bar' 等于 $foo === NULL and $foo = 'bar'
        • 不完全是,isset() 测试 $foo 是否为 null 或是否曾被赋值(将其置于等式中会引发错误!),但如果它是 !== NULL 或其他可能是真的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多