给variables一个默认值的最佳方式(模拟Perl ||,|| =)
我喜欢在Perl中做这样的事情: $foo = $bar || $baz
$foo = $bar || $baz
将$baz
赋值给$foo
如果$bar
为空或未定义。 你也有$foo ||= $bletch
,如果$foo
没有被定义或是空的,它只会把$bletch
赋值给$foo
。
在这种情况下,三元运算符是单调乏味的。 当然,PHP中有一个简单而优雅的方法?
或者是使用isset()的自定义函数的唯一答案?
PHP 5.3有一个简写?:
operator:
$foo = $bar ?: $baz;
如果它不是一个空值(我不知道这将在PHP中如何与Perl不同),否则$baz
,并且与Perl和旧版本的PHP中的相同:
$foo = $bar ? $bar : $baz;
但是PHP没有这个复合赋值操作符(也就是说,没有Perl的||=
等价物)。
另外,如果没有设置$bar
,PHP将会发出噪音,除非您closures通知。 isset()
和empty()
之间也有语义上的区别。 如果variables不存在,或者设置为NULL
,则前者返回false。 如果后者不存在,则返回true,或者设置为0
, ''
, false
或NULL
。
在PHP 7中,我们终于有办法优雅地做到这一点。 它被称为空合并运算符 。 你可以像这样使用它:
$name = $_GET['name'] ?? 'john doe';
这相当于
$name = isset($_GET['name']) ? $_GET['name']:'john doe';
与旧的PHP版本保持兼容的常见习惯是:
$var = $bool or $var = "default"; // If I use it, then only with excessive spaces for clarity.
这适用于可以在布尔上下文中进行评估的值。 这里的好处是,它也给你说debugginge_notice应该variables是不确定的。
感谢所有伟大的答案!
对于任何人来到这里寻找可能的select,这里有一些function可以帮助我们摆脱这种困境。
function set_if_defined(&$var, $test){ if (isset($test)){ $var = $test; return true; } else { return false; } } function set_unless_defined(&$var, $default_var){ if (! isset($var)){ $var = $default_var; return true; } else { return false; } } function select_defined(){ $l = func_num_args(); $a = func_get_args(); for ($i=0; $i<$l; $i++){ if ($a[$i]) return $a[$i]; } }
例子:
// $foo ||= $bar; set_unless_defined($foo, $bar); //$foo = $baz || $bletch $foo = select_defined($baz, $bletch);
我相信这些可以改进。
在早于7. *的PHP中,可以使用?:对于一个未定义的variables,其错误在本地被@
$foo = @$bar ?: $baz;