2012-03-02 74 views
28

我已经看到了很多:$fp = fopen($filepath, "w") or die(); 但我似乎无法找到任何有关此“或”语法的真实文档。它足够明显,但我可以在任何地方使用它?并且必须紧跟die()?有没有什么注意事项使用or时,你可以使用类似PHP“或”Syntax

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

我知道这似乎是一个愚蠢的问题,但我找不到这方面的任何硬性规定。谢谢。

+1

'或'可以用来组合*表达式*,而不是*语句*。由于它的运算符优先级较低(与赋值相比),它有时很有用。顺便说一下,你的if块缺少花括号。在你掌握之前不要查找语法快捷键。 – mario 2012-03-02 14:57:01

+1

条件句后面跟一条语句不需要大括号。 – Andrew 2013-02-14 23:09:54

+2

是是的;语言语法允许。尽管如此,它看起来很业余,而且通常都会皱眉。 – mario 2013-02-17 23:02:19

回答

14

这是一个逻辑运算符,可用于任何逻辑表达式。

http://php.net/manual/en/language.operators.logical.php

+5

您还应该将优先级看作'$ fp = fopen($ filepath,“w”)或die();'与$ fp = fopen($ filepath,“w”)不同。 (';';' – 2012-03-02 15:23:39

+1

)向上面添加更多信息:第一条语句(使用'or')查看第一个表达式$ fp = fopen($ filepath,“w”)'返回false(或任何PHP认为等于假,如'null'或'0')。如果,并且只有在它执行时,才会执行第二个语句'die()'。第二个是做同样的事情,但通常只应用于'if'上下文中。 – Thomas 2013-08-14 18:42:13

3

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

+0

从技术上讲,它测试第一个表达式是否返回布尔值false,然后用快捷方式布尔表达式执行第二个表达式。如果第一个表达式返回一个非错误值,则快捷布尔表达式意味着不需要执行第二个表达式 – 2012-03-02 14:59:14

5

or只是做了一个boolean比较。

fopen()返回的结果可以视为这样一个布尔值,因为如果失败(如果不是,则返回FALSE)。

如果失败,语句将在右侧进行求值,因此函数die()被调用。

0

它可以用作||但是具有不相同的优先级: http://www.php.net/manual/en/language.operators.precedence.php

操作符的优先级指定如何“紧密”其结合2个 表达式在一起。例如,在表达式1 + 5 * 3中, 的答案是16而不是18,因为乘法(“*”)运算符具有比加法(“+”)运算符更高的优先级 。必要时,可以使用圆括号 强制优先。例如:(1 + 5)* 3 值为18

3

'或' 在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)); 

的或死亡()特技是有几个原因非常差的选择:

  1. 这不是一个非常好的方式来向用户显示错误消息。
  2. 您无法以任何方式捕捉错误。
  3. 您无法记录错误。
  4. 您无法控制它是否应该输出到屏幕上。在开发环境中这样做可以,但肯定不是在生产环境中。

    5.它阻止你做任何类型的清理。它只是突然结束脚本。

参考文献:[此处输入链接的描述] [1]

[1]:http://www.phpfreaks.com/blog/or-die-must-dieenter code here

5

这是巧妙的方法,从一些PHP承袭前作的基础上,事实上,PHP相当巧妙不会评价以下或任何表情,如果第一个返回真:

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

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

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

8

让我们只说:

$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(); 

它仅仅是重要的优先。