php“||”赋值逻辑与 Javascript 相比
php "||" assignment logic compared to Javascript
我正在测试 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。
我通过将逻辑放在方括号中 eg
让它在某一时刻输出 $mystring 的内容
echo ($output || $mystring);
它曾经输出:
a non empty string
之后它立即停止工作,我不确定是什么改变破坏了它。
在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" 的内容是
a non empty string
然后如果我像这样将 mystring 更改为空字符串
mystring = ""; //"a non empty string";
我明白了
couldn't find something valuable
php的“||”如何在分配工作期间?
有人可以解释一下吗?
有了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');
如果您在 php 中分配一个条件表达式,您总是会得到一个布尔值(即严格的 true
或 false
),它不像在 [=33= 中那样工作] 分配 "truthy" 值的位置,因此在 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
如果需要连接表达式,请使用括号:
$c = ($a ? $a : ($b ? $b : "not found"));
我正在测试 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。 我通过将逻辑放在方括号中 eg
让它在某一时刻输出 $mystring 的内容echo ($output || $mystring);
它曾经输出:
a non empty string
之后它立即停止工作,我不确定是什么改变破坏了它。
在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" 的内容是
a non empty string
然后如果我像这样将 mystring 更改为空字符串
mystring = ""; //"a non empty string";
我明白了
couldn't find something valuable
php的“||”如何在分配工作期间? 有人可以解释一下吗?
有了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');
如果您在 php 中分配一个条件表达式,您总是会得到一个布尔值(即严格的 true
或 false
),它不像在 [=33= 中那样工作] 分配 "truthy" 值的位置,因此在 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
如果需要连接表达式,请使用括号:
$c = ($a ? $a : ($b ? $b : "not found"));