PHP智能||(OR)运算符,就像Javascript中一样

PHP smart || (OR) operator just like in Javascript

本文关键字:一样 Javascript 运算符 智能 OR PHP 就像      更新时间:2023-09-26

在PHP:中使用这样的构造安全吗

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

我有JS的背景,这是安全的,因为我们可以信任truthy/false值。然而,我的同事习惯于使用isset:构建

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

这在我看来有点冗长。

我在phabricator.com上发现了一篇文章,其中概述了PHP中不同的truthy/false值,并提供了以下表格:

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

如果有人能对此事有所了解,我将不胜感激。

第一件事:

$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

使用

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

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

但是,如果设置了$file['filename1'],但没有设置$file['filename2'],则会返回值1,并且不会引发任何错误,但代码仍然不正确。

所以,你会想走isset的路,或者使用(正如VAGABOND所指出的):

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

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

与相同

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

||如果在if中有多个条件,则使用,如果其中一个条件为真,则为真。

?:是一个三元运算符

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

$filename = (condition) ? what_happens_if_true : what_happens_if_false;