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

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

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

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

 foo ||= 'bar' 

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

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

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

所以你可以写:

 $foo = $foo ?? 'bar'; 

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

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

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

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

我真的很喜欢?:运算符。 不幸的是,它还没有在我的生产环境中实现。 所以,如果我要看起来像ruby-ish,我会选择以下内容:

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

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

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

您可以创建自己的function:

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

我发现它具有可读性,简洁性和高性能:

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

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

[编辑]

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

从手册:

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

但它并不完全相同。 无论如何希望它有所帮助。

没有。 根据w3schools ,该运营商不存在。

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

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

与ruby最相似的是:

 $foo or $foo = 'bar'; 

如果$ foo是假的

 $foo = 0; $foo = '0'; $foo = NULL; $foo = ''; $foo = array(); $foo = FALSE;