PHP是否与|| =运算符等效?

时间:2009-07-19 08:17:58

标签: php

我想要分配一个尚未分配的变量。 PHP执行以下操作的方式是什么?

$result = null;
$result ||= check1();
$result ||= check2();
$result ||= "default";

我检查了standard operatorsis_null函数,但似乎没有一种简单的方法可以执行上述操作。

6 个答案:

答案 0 :(得分:17)

isset()是通常的做法:

if (!isset($blah)) {
  $blah = 'foo';
}

注意:您可以将null分配给变量,然后分配该变量。这会因isset()is_null()而产生不同的结果,因此您需要明确“未分配”的含义。见Null vs. isset()。这也是一种需要注意自动类型转换的情况,这意味着使用!=/=====/!==取决于所需的结果。

您也可以使用布尔速记(Perl ||=运算符就是这样)。从PHP 5.2.x开始,没有像你这样的运营商。在Perl:

$a ||= $b;

相当于:

$a = $a || $b;

您可以在PHP中执行第二种形式,但PHP有一些关于type juggling的简单规则。见Converting to boolean

  

转换为boolean时,   以下值被视为FALSE:

     
      
  • boolean FALSE本身
  •   
  • integer 0(零)
  •   
  • float 0.0(零)
  •   
  • stringstring“0”
  •   
  • 一个零元素的array
  •   
  • object,其成员变量为零(仅限PHP 4)
  •   
  • 特殊类型NULL(包括未设置的变量)
  •   
  • SimpleXML从空标签创建的对象
  •   
     

其他每个值都被视为TRUE(包括任何资源)。

所以之后:

$a = 0;
$a = $a || 5;

$ a等于5.同样:

$a = 0;
$b = '';
$c = $a == $b; // true
$d = $a === $b; // false

你必须注意这些事情。

答案 1 :(得分:14)

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

答案 2 :(得分:5)

从php 5.3开始,您可以使用:

$result = $result ?: check1();

答案 3 :(得分:1)

我想出了这个函数,它有一个副作用,就是关闭无用的未定义变量通知。它足够接近Javascript对我的行为:

function default_value(&$var, $default) {
    return isset($var) ? $var : $default;
}

$want_something = default_value($_POST['mightbeunset'], false);

答案 4 :(得分:0)

如何使用几个嵌套的三元运算符?

对我而言,这是处理问题的最简单方法。由于您可以使用嵌套的三元运算符,因此您应该能够在需要时添加更多检查。

$var = isset($var) ? $var : ($i=check1()) ? $i : ($i=check2()) ? $i : "default" ;

这几乎是相同数量的代码,它应该工作..除非我误解了你。如果是这样的话我很抱歉。

与您作为示例发布的原始代码相比,长度几乎相同:

$result = null; $result ||= check1(); $result ||= check2(); $result ||= "default";
 - vs -
$var = isset($var) ? $var : ($i=check1()) ? $i : ($i=check2()) ? $i : "default" ;

嵌套的三元运算符可能有点令人困惑,所以在这里你可以得到注释:

    // Is $var set?
    $var = isset($var) ?
        // TRUE: It is, use $var
        $var :
        // FALSE: $var is not set, run check1
        ( $i=check1() ) ?
        // TRUE: the function check1 returned valid data
        $i :
        // FALSE: the function check1 returned null or false, run check2
        ($i=check2()) ?
        // TRUE:  the function check2 returned valid data
        $i :
        // FALSE: the function check1 returned null or false, set default value
        "default" ;

答案 5 :(得分:0)

我还没有尝试过,但多年来一直想和PECL Operator一起玩。