如果第一个参数的计算结果为 false,php 是否会计算 or 语句的第二个参数?

Mar*_*ica 2 php evaluation lazy-evaluation

所以我的问题是关于 php 在 or 语句采用两个函数的情况下的行为。当第一个函数的计算结果为 true 时,第二个函数是否仍有可能被执行?

我希望下面的代码可以澄清我的意思:

$dbh->startTransaction();

$stmt = $dbh->prepare("DELETE FROM foo WHERE id=:id");

$stmt->bindParam(':id', $id, PDO::PARAM_INT);

if (!$stmt->execute() || !bar($id)) {
    $dbh->rollBack();
}

Run Code Online (Sandbox Code Playgroud)

我想确定的是,执行失败时永远不会调用bar()它。$stmt

我知道在某些语言中 or 语句会在!$stmt->execute()评估为 true 时返回 true,并且我可以确定bar()除非!$stmt->execute()评估为 false(意味着$stmt->execute()评估为 true 并且查询成功),否则不会调用该语句。

我在 php 中是否有这种确定性,或者服务器是否有可能同时或以相反的顺序进行评估$stmt->execute()bar($id)并以这种方式对我的数据库造成严重破坏?

我假设我也能够将我在这里得到的任何答案应用到 and 声明中。如果情况并非如此,请告诉我。

Kir*_*iya 6

逻辑运算符||意味着如果第一个表达式的计算结果为 true,则不会执行第二个表达式。如果您使用or|则即使第一个表达式的计算结果为 true,也会计算第二个表达式。

if ($expression || $expression) {
    //
}
Run Code Online (Sandbox Code Playgroud)

在这里,如果第一个表达式的计算结果为 true,则不||会让第二个表达式计算并且流程在if块中继续。仅当第一个表达式变为 时才计算第二个表达式false

这个布尔运算与主要编程语言中的解释完全一样,而不仅仅是在 php 中。如果您想深入了解,请访问php Doc 中的逻辑运算符

逻辑运算符

根据优先规则,逻辑运算符||具有左关联性,规定左表达式始终首先计算,如果左表达式失败,则将计算右表达式。