PHP智能|| (或)运算符就像在Javascript中一样

时间:2013-08-30 11:22:35

标签: php javascript types

在PHP中使用这样的结构是否安全:

$filename = $file['filename1'] || $file['filename2'];

我有JS的背景,这是安全的,因为我们可以信任truthy / falsey值。但是,我的同事习惯于使用isset

进行构建

$filename = 'filename'. (isset($file['filename2']) ? '2' : '1');

对我来说,这看起来有点冗长。

我发现an article on phabricator.com概述了PHP中不同的truthy / falsey值并提供了此表:

VALUE             if()        empty()     isset()

null              false       true        false
0                 false       true        true
0.0               false       true        true
"0"               false       true        true
""                false       true        true
false             false       true        true
array()           false       true        true
EVERYTHING ELSE   true        false       true

我很感激有人在这件事上给我见解。

4 个答案:

答案 0 :(得分:3)

第一件事:

$filename = $file['filename1'] || $file['filename2'];  //incorrect syntax

应该是

$filename = $file['filename1'] || $filename = $file['filename2'];//depending on the condition

第二件事:

isset($file['filename2']) ? '2' : '1';

这是一个替换详细代码的简写。

相同的代码可以写成:

if(isset($file['filename2']){
   $filename='filename2';
}else{
   $filename='filename1';
}

所以,4行代码可以写成一行。这里没有详细说明。智能编码。


第三件事:

这是理想的做法。

return isset($file['filename2'])?$file['filename2']:$file['filename1'];

了解的样本:

echo (age>18)?"where is my beer":"you are Underage!!!"; //codition:true:false

答案 1 :(得分:1)

$filename = 'filename'. (isset($file['filename2']) ? '2' : '1');

相同
if(isset($file['filename2']){
   $filename='filename2';
}else{
   $filename='filename1';
}
  

||如果你在if中有多个条件,如果它们是真的,那么它就是真的,这是真的。

     

?:是三元运算符

答案 2 :(得分:1)

如果你想要一个数组中的随机值,你可以使用array_rand(),但是如果你想要一个基于条件的值,你应该使用三元运算符:

$filename = (condition) ? what_happens_if_true : what_happens_if_false;

答案 3 :(得分:1)

使用

$filename = $file['filename1'] || $file['filename2'];

如果未设置$file['filename1'],您将收到错误,例如Undefined index: filename1',因为(OR)运算符将首先检查第一个语句。

但是,如果设置了$file['filename1'],但$file['filename2']未设置,则返回值1并且不会抛出任何错误,但您的代码仍然不正确。

所以,你会想要isset方式,或者使用(如VAGABOND指出的那样):

$filename = $file['filename1'] || $filename =$file['filename2'];