我正在使用SensioLabs Insight将我的项目代码质量保持在已使用工具的最佳实践之上。
此行在SLInsight分析期间引起警告:
$handle = fopen($file, 'w') or die('Cannot open file: '.$file);
SensioLabs说:
应避免使用逻辑运算符。
[...]
或运算符与||的优先级不同。这可能导致意外行为,使用||代替。
好的但是,如果我只是使用||而不是'或',像这样:
$handle = fopen($file, 'w') || die('Cannot open file: '.$file);
由于No such file or directory
失败,我得到了经典的fopen
错误,
而不是我期待的(死亡行动和回复信息)。
为了避免这种情况,我在执行fopen
之前使用条件:
if(!file_exists($file)) {
throw $this->createNotFoundException('Le fichier '.$file.' n\'existe pas.');
}
$handle = fopen($file'.log', 'r');
“||”有什么用处?在我想要的变量分配中?
提前感谢我的启发。
答案 0 :(得分:5)
应避免使用逻辑运算符。
在您的情况下,是您想要的or
的优先级。我认为SensioLabs指的是条件中的复杂表达式,这可能会产生误导。
or
运算符的优先级较低,甚至低于赋值=
运算符。例如:
if ($a = getRecordOrFalse($userId) || $boolValue) {
正如您所料:
if (($a = getRecordOrFalse($userId)) || ($boolValue)) {
$a
包含返回的值getRecordOrFalse
,如果true
为真,则此条件为$boolValue
,即使$a
不是or
。但是使用if ($a = getRecordOrFalse($userId) or $boolValue) {
,您会得到完全不同的行为:
if ($a = (getRecordOrFalse($userId) or $boolValue)) {
相当于:
$a
现在getRecordOrFalse($userId) or $boolValue)
将是$handle = (fopen($file, 'w') or die('Cannot open file: '.$file));
条件的结果给出的布尔值。
但在你的情况下,这是有道理的:
if (false === $handle = fopen($file, 'w')) {
die('Cannot open file: '.$file);
}
为提高可读性,您可以采用以下条件:
if (!$handle = fopen($file, 'w')) {
die('Cannot open file: '.$file);
}
或者只是
function time(d) {
var k = new Array(7);
k[0]= "Sunday";
k[1] = "Monday";
k[2] = "Tuesday";
k[3] = "Wednesday";
k[4] = "Thursday";
k[5] = "Friday";
k[6] = "Saturday";
var n = weekday[d.getDay()];
return(n+', '+d.getHours()+':'+d.getMinutes());
}