现在我有以下代码:
stream_wrapper_register("var", "VariableStream")
or die("Failed to register protocol");
我想在死前做额外的事情以防函数失败。所以它提出了这个问题:
'或'关键字如何正常工作?
在许多SO问题或答案中,我看到人们创建了一个函数,如下所示:
function doStuff() {
header('HTTP/1.1 500 Internal Server Error');
die("Failed to register protocol");
}
stream_wrapper_register("var", "VariableStream")
or doStuff();
...但是在面向对象的上下文中这是不切实际的,因为我真的不想在我的对象中为它创建一个方法,我还不能使用闭包。
所以现在,我已经使用了这段代码,但我不确定它会有完全相同的行为:
if (!stream_wrapper_register("var", "VariableStream") {
header('HTTP/1.1 500 Internal Server Error');
die("Failed to register protocol");
}
答案 0 :(得分:9)
带有“或”的语句有效,因为PHP-Interpreter很聪明: 因为“或”的连接是真的,如果它们中的第一个为真,则当第一个为真时它停止执行该语句。
想象一下以下(PHP)代码:
function _true() { echo "_true"; return true; }
function _false() { echo "_false"; return false; }
现在你可以链接函数调用并在输出中看到会发生什么:
_true() or _true() or _true();
只会告诉你“_true”,因为链在第一个为真之后结束,其他两个永远不会被执行。
_false() or _true() or _true();
将给出“_false_true”,因为第一个函数返回false并且解释器继续。
同样适用于“和”
你也可以用“和”来做同样的事情,区别在于第一个“假”出现时“和”的链完成了:
_false() and _true() and _true();
将回显“_false”,因为结果已经完成,不能再更改了。
_true() and _true() and _false();
将写入“_true_true_false”。
因为大多数功能通过在成功时返回“1”来表示成功,并且在出错时可以执行function() or die()
之类的操作。
但是有些函数(很少在php中)在成功时返回“0”,而!= 0表示特定错误。然后,您可能必须使用function() and die()
。
答案 1 :(得分:5)
a or b
在逻辑上等同于
if (!a) {
b
}
所以你的解决方案很好。
答案 2 :(得分:2)
完全相同,因为stream_wrapper_register()
返回一个布尔值。
答案 3 :(得分:2)
这两种语法是等价的,只是编码风格/偏好的问题,关于你使用哪一种。就个人而言,我不喜欢<statement> or die(...)
,因为在大多数情况下它似乎更难阅读。
答案 4 :(得分:0)
这是一个“OR”运算符。 标志是||
因此,作为一个例子考虑:
<?php
$count = NULL;
if ($count == 0 || $count == NULL) {
echo "\nNo Value!\n";
var_dump($count);
} else {
echo "\nSome Value";
}
?>