给变量赋值的最佳方法(模拟Perl ||,|| =)

时间:2011-05-12 01:50:20

标签: php perl operators default-value

我喜欢在Perl中执行此类操作:$foo = $bar || $baz如果$baz为空或未定义,则将$foo分配给$bar。您还有$foo ||= $bletch,如果$bletch未定义或为空,则只会将$foo分配给$foo

在这种情况下,三元运营商既乏味又乏味。当然,PHP中有一种简单,优雅的方法吗?

或者是使用isset()的自定义函数的唯一答案?

8 个答案:

答案 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''falseNULL

答案 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)

可能的解决方案:defaultFor()

除非我们有一个工厂解决方案(确实很烦人),否则我建议使用以下小助手。在大多数情况下,它都能胜任:


    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),只有falsenil为假, 这意味着01都是正确的。由于这种跨语言 模棱两可,我认为在这些情况下最好是明确的:

if ($bar !== 0) {
   $foo = $bar;
} else {
   $foo = $baz;
}

或:

$foo = $bar !== 0 ? $bar : $baz;