替代PHP中的'或'关键字

FMa*_*008 5 php keyword

现在我有以下代码:

stream_wrapper_register("var", "VariableStream")
    or die("Failed to register protocol");
Run Code Online (Sandbox Code Playgroud)

而且我想在死前做额外的事情以防函数失败.所以它提出了这个问题:

'或'关键字如何正常工作?

在许多SO问题或答案中,我看到人们创建一个函数,如下所示:

function doStuff() {
    header('HTTP/1.1 500 Internal Server Error');
    die("Failed to register protocol");
}

stream_wrapper_register("var", "VariableStream")
    or doStuff();
Run Code Online (Sandbox Code Playgroud)

...但是在面向对象的上下文中这是不切实际的,因为我真的不想在我的对象中为它创建一个方法,我还不能使用闭包.

所以现在,我已经使用了这段代码,但我不确定它是否会有完全相同的行为:

if (!stream_wrapper_register("var", "VariableStream") {
    header('HTTP/1.1 500 Internal Server Error');
    die("Failed to register protocol");
}
Run Code Online (Sandbox Code Playgroud)

EGO*_*rds 9

带有"或"的语句有效,因为PHP-Interpreter非常聪明:因为"或"的连接是真的,如果第一个为真,它会在第一个为真时停止执行语句.

想象一下以下(PHP)代码:

function _true()  { echo "_true";  return true;  }
function _false() { echo "_false"; return false; }
Run Code Online (Sandbox Code Playgroud)

现在你可以链接函数调用并在输出中看到会发生什么:

_true() or _true() or _true();
Run Code Online (Sandbox Code Playgroud)

只会告诉你"_true",因为链条在第一个为真之后结束,其他两个永远不会被执行.

_false() or _true() or _true();
Run Code Online (Sandbox Code Playgroud)

将给出"_false_true",因为第一个函数返回false并且解释器继续.

同样适用于"和"

你也可以用"和"来做同样的事情,区别在于"和"的链完成,当第一个"假"出现时:

_false() and _true() and _true();
Run Code Online (Sandbox Code Playgroud)

将回显"_false",因为结果已经完成,不能再改变了.

_true() and _true() and _false();
Run Code Online (Sandbox Code Playgroud)

会写"_true_true_false".

因为大多数功能都通过在成功时返回"1"表示成功,并且在出错时你可以做类似的事情function() or die().但是有些函数(很少在php中)在成功时返回"0",而!= 0表示特定错误.那么你可能不得不使用function() and die().


Ale*_*sky 5

a or b
Run Code Online (Sandbox Code Playgroud)

在逻辑上等同于

if (!a) {
    b
}
Run Code Online (Sandbox Code Playgroud)

所以你的解决方案很好.