php“||”赋值逻辑与Javascript相比

时间:2015-05-14 10:23:50

标签: javascript php variable-assignment

我正在测试Heredoc和||功能

function test()
{
    $obj = [(object)['col1'=>'val1'],
            (object)['col2'=>'val2'],
            (object)['col3'=>'val3']];
    $output = '';
$mystring = <<<EOT
a non empty string
EOT;

    foreach($obj as $prop)
    {
        foreach($prop as $i)
        {
            $output .= <<<EOT
            <div style='background-color:lightblue'> 
            \$head  : {gettype($i)} 
            </div>
EOT;
        }
    }
    $out =  $output || $mystring || 'couldn\'t find something valuable';
    echo $out;
}
test();

我得到了

的输出
  

1

表示布尔值true。 我让它通过将逻辑放在括号中来输出$ mystring的内容,例如

echo ($output || $mystring);

用于输出:

  

非空字符串

它直接停止工作,我不确定是什么改变了它。

在javascript中:

    function test()
    {
    
        var obj = [{'col1':'val1'},
                {'col2':'val2'},
                {'col3':'val3'}];
        var output = '';
        var mystring ="a non empty string";
    
        for(var prop in obj)
        {
            for(var i in prop)
            {
                output += 
                "<div style='background-color:lightblue'>" +
                    i + " : " + typeof prop[i] +
                    "</div>";
            }
        }
        out =  output || mystring || 'couldn\'t find something valuable';
        document.write(out);
        console.log("outputting \n\t" + out);
    }
    test();

在逻辑方面与php略有不同,但是||在任务期间按预期工作。我得到了

  

0:string

     

0:string

     

0:string

代码如上。如果注释掉内部for循环,那么

for(var prop in obj)
{
    /*for(var i in prop)
    {
        output += 
        "<div style='background-color:lightblue'>" +
        i + " : " + typeof prop[i] +
        "</div>";
    }*/
}

我得到了“mystring”的内容,这是

  

非空字符串

如果我然后将mystring更改为像这样的空字符串

mystring = ""; //"a non empty string";

我得到了

  

无法找到有价值的东西

php如何“||”在任务工作期间? 有人可以解释一下吗?

2 个答案:

答案 0 :(得分:2)

如果你在php中指定一个条件表达式,你总是得到一个布尔值(即严格truefalse),它在javascript中不起作用,其中&#34; truthy&#34 ;值被赋值,所以在PHP中

$a = "";
$b = 42;
$c = ($a || $b); // == true

在javascript中

var a = "";
var b = 42;
var c = (a || b); // == 42
遗憾的是,语言设计就是这样。

正如@billyonecas报道的那样,它也在对文档的评论中:http://php.net/manual/en/language.operators.logical.php#77411

要在PHP中获得类似的行为,我们必须执行以下操作:

$a = "";
$b = 42;
$c = ($a ?: $b); // newer php version
$c = ($a ? $a : $b); // older php version

如果你需要连接表达式,请使用parethesis:

$c = ($a ? $a : ($b ? $b : "not found"));

答案 1 :(得分:1)

使用PHP,您可以使用?:

$out =  $output ?: $mystring;

或者在旧版本的PHP中:

$out =  $output ? $output : $mystring;

您还可以使用empty()来获取更明确的代码:

$out =  empty($output) ? $mystring : $output;

http://php.net/manual/en/function.empty.php

注意:这些三元表达式等同于if-else:

if(empty($output))
{
    $out = $mystring;
}
else
{
    $out = $output;
}

使用嵌套三元组,添加括号,默认优先级为:

$out =  $output ? $output : $mystring ? $mystring : 'default';

这是:

$out =  ($output ? $output : $mystring) ? $mystring : 'default';

所以你必须这样做:

$out =  $output ? $output : ($mystring ? $mystring : 'default');