PHP相当于Ruby的or-equals(foo || = bar)?

ber*_*kes 20 php ruby operators

在PHP中,我经常写类似的行

isset($foo)? NULL : $foo = 'bar'
Run Code Online (Sandbox Code Playgroud)

在红宝石中有一个明亮的捷径,叫做或等于

foo ||= 'bar'
Run Code Online (Sandbox Code Playgroud)

PHP有这样的操作符,快捷方式或方法调用吗?我找不到一个,但我可能错过了它.

Gor*_*don 22

从PHP7开始,您可以使用Null Coalesce运算符:

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

所以你可以写:

$foo = $foo ?? 'bar';
Run Code Online (Sandbox Code Playgroud)

它将使用$foo如果它被设置而不是null或指定"bar" $foo.

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

$foo = isset($foo) ? $foo : 'bar';
Run Code Online (Sandbox Code Playgroud)

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

  • 如果他们还添加像?? =这样的东西会很好 (6认同)

小智 8

我真的很喜欢?:运算符.不幸的是,它还没有在我的生产环境中实现.所以,如果我要看起来像ruby-ish,我会去寻找类似的东西:

isset($foo) || $foo = 'bar';
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望它更短(更慢,并可能产生意外结果):

@$foo || $foo = 'bar';
Run Code Online (Sandbox Code Playgroud)


Fel*_*ing 5

你可以创建自己的功能:

function setIfNotSet(&$var, $value) {
    if(!isset($var)) {
        $var = $value;
    }
}
Run Code Online (Sandbox Code Playgroud)


rav*_*ren 5

我觉得它可读,简洁,高效:

isset($foo) or $foo = 'bar';
Run Code Online (Sandbox Code Playgroud)