我喜欢在Perl中执行此类操作:$foo = $bar || $baz
如果$baz
为空或未定义,则将$foo
分配给$bar
。您还有$foo ||= $bletch
,如果$bletch
未定义或为空,则只会将$foo
分配给$foo
。
在这种情况下,三元运营商既乏味又乏味。当然,PHP中有一种简单,优雅的方法吗?
或者是使用isset()的自定义函数的唯一答案?
答案 0 :(得分:189)
PHP 5.3有一个速记?:
运算符:
$foo = $bar ?: $baz;
如果它不是一个空值,我会指定$bar
(我不知道PHP与Perl的不同之处),否则为$baz
,并且在Perl和更早版本中与此相同PHP版本:
$foo = $bar ? $bar : $baz;
但PHP没有这个复合赋值运算符(也就是说,没有Perl的||=
的等价物。)
此外,如果未设置$bar
,PHP将发出噪音,除非您关闭通知。 isset()
和empty()
之间也存在语义差异。如果变量不存在,则前者返回false,或者设置为NULL
。如果不存在,则后者返回true,或者设置为0
,''
,false
或NULL
。
答案 1 :(得分:85)
在PHP 7中,我们终于有办法优雅地完成这项工作。它被称为this post。您可以像这样使用它:
$name = isset($_GET['name']) ? $_GET['name']:'john doe';
这相当于
{{1}}
答案 2 :(得分:8)
感谢所有出色的答案!
对于任何来这里寻找替代方案的人来说,这里有一些功能可以帮助你解决这类问题。
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);
我确信这些可以改进。
答案 3 :(得分:7)
保持与旧版PHP兼容的常用习惯是:
$var = $bool or $var = "default";
// If I use it, then only with excessive spaces for clarity.
这适用于可以在布尔上下文中计算的值。这里的优点是,如果变量未定义,它还会为您提供调试e_notice。
答案 4 :(得分:3)
在早于7. *的PHP中,可以使用?:表示使用@
在本地抑制错误的未定义变量:
$foo = @$bar ?: $baz;
答案 5 :(得分:0)
这是isset
案例的另一种好格式
isset($foo) || $foo= $bar;
另一种简单的方法,它将为您提供更多控制权,因为您可以添加更多条件并同时分配给另一个变量
$foo = (isset($oData['foo']))?$bar['foo']:'default value';
答案 6 :(得分:0)
除非我们有一个工厂解决方案(确实很烦人),否则我建议使用以下小助手。在大多数情况下,它都能胜任:
function defaultFor(&$x,$default=null) {
if(!isset($x)) $x = $default;
}
//-------------------- Now you can do this: --------------
defaultFor($a,"Jack"); // if $a is not set, it will be "Jack"
defaultFor($x); // no more notices for $x but keep it !isset
我希望这接近您想要实现的目标。如果将它与不存在的变量一起使用,它不会给您任何提示,这非常方便。当然,它有一个缺点:默认值总是总是事先计算出来的,所以不要将它与重的第二个参数一起使用,例如file_get_contents之类的东西。在这种情况下,最好使用isseting。
答案 7 :(得分:0)
我认为一般来说是这样的:
$foo = $bar || $baz;
是个坏主意,除非$bar
和$baz
都是布尔值。如果他们没有:
$bar = 10;
$baz = 11;
然后问题变成了:什么决定某件事是对还是错?最
人们可能会期望零是假的,而其他所有东西都是真。
但是对于某些语言(例如Ruby),只有false
和nil
为假,
这意味着0
和1
都是正确的。由于这种跨语言
模棱两可,我认为在这些情况下最好是明确的:
if ($bar !== 0) {
$foo = $bar;
} else {
$foo = $baz;
}
或:
$foo = $bar !== 0 ? $bar : $baz;