PHP "or" 语法

38

我经常看到这样的代码:$fp = fopen($filepath, "w") or die(); 但我似乎找不到关于这种“or”语法的真正文档。显然它的作用很明显,但我能在任何地方使用它吗?必须后面跟着die()吗?当你可以使用其他方式时,使用or是否有任何注意事项?

if (file_exists($filepath))
   $fp = fopen($filepath,"r");
else
   myErrMessage();

我知道这似乎是一个愚蠢的问题,但我找不到任何明确的规则。谢谢。


1
“or” 可以用于组合 表达式,而不是 语句。由于其运算符优先级较低(与赋值相比),因此有时很有用。顺便说一下,你的 if 块缺少花括号。在掌握之前不要寻找语法快捷方式。 - mario
1
条件语句后跟单个语句时,花括号是不必要的。 - Andrew
3
是的,语言语法允许这样做。然而,这看起来很业余,通常会受到不赞成的反应。 - mario
8
我觉得这是一个看法问题。我还会争辩说,任何(合理的)格式偏好都相对较差地表明了我掌握和未掌握的内容,并且绝对不应以此为理由来忽略我的问题,直到我的口味符合你的口味。 - Andrew
8个回答

15

6
你还应该考虑优先级,因为$fp = fopen($filepath, "w") or die();$fp = fopen($filepath, "w") || die();是不同的。 - Michael Laffargue
1
为了对上面的内容进行补充:第一个语句(使用 or)检查第一个表达式 $fp = fopen($filepath, "w") 是否返回 false(或任何 PHP 认为等于 false 的东西,比如 null0)。仅当它返回 false 时,才会执行第二个语句 die()。第二个语句也是做同样的事情,但通常只应在 if 上下文中使用。 - tschoffelen

14

让我们这样说:

$result = first() || second();

将评估为:

if (first()) {
    $result = true;
} elseif (second()) {
    $result = true;
} else {
    $result = false;
} 

当:

$result = first() or second();

将被评估为:

if ($result = first()) {
    // nothing
} else {
    second();
}

换言之,您可以考虑:

$result = first() || second();

$result = (first() || second());

并且:

$result = first() or second();

成为:

($result = first()) || second();

这只是一个优先顺序的问题。


6

这是一个不错的技巧,从一些PHP前辈那里继承而来,基于PHP相当聪明的事实:如果第一个表达式返回true,它将不会评估OR后面的任何表达式:

function a($ret){
    echo "FOO";
    return $ret;
}
function b($ret){
    echo "BAR";
    return $ret;
}

$result = (a(true) OR b(true));

只会打印出FOO,这意味着b()甚至没有被执行。


5

or 只是进行 boolean 比较。

fopen() 返回的内容可以被视为布尔值,因为如果失败,它会返回 FALSE(如果成功,则返回其他值)。

如果失败,则语句将向右评估,因此会调用函数 die()


3

'Or'在PHP中类似于C语言的语法(||)

<?php 
if( ($a==1 || $a==2) && ($b==3 || $b==4) && ($c==5 || $c==6) ) { 
     //do that something here. 
} 
?>

您所说的“或”只是一个技巧,如下所述:
示例:
$result = mysql_query('SELECT foo FROM bar', $db) or die('Query failed: ' . mysql_error($db));

使用 or die() 技巧是一个非常糟糕的选择,原因如下:

  1. 这不是向用户展示错误消息的好方法。
  2. 你无法以任何方式捕获错误。
  3. 你无法记录错误。
  4. 你无法控制它是否应该输出到屏幕上。在开发环境中这样做没问题,但在生产环境中绝对不行。

    5. 它阻止你进行任何清理工作。它只是突然结束了脚本。

参考资料:[进入链接描述][1]

[1]: http://www.phpfreaks.com/blog/or-die-must-die输入代码


3
基本上意思是“如果第一条命令失败,则执行第二条命令。” 在你的例子中,如果PHP无法打开文件,它将终止脚本(die())。

从技术上讲,它测试第一个表达式是否返回布尔值false,然后使用快捷布尔表达式执行第二个表达式。如果第一个表达式返回非false值,则快捷布尔表达式意味着无需执行第二个表达式。 - Mark Baker

1

0

它可以像||一样使用,但没有相同的优先级: http://www.php.net/manual/en/language.operators.precedence.php

运算符的优先级指定了它如何将两个表达式“紧密”地绑定在一起。例如,在表达式1 + 5 * 3中,答案是16而不是18,因为乘法(“*”)运算符的优先级高于加法(“+”)运算符。如果必要,可以使用括号来强制优先级。例如:(1 + 5) * 3的值为18。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接