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 声明中。如果情况并非如此,请告诉我。
逻辑运算符||意味着如果第一个表达式的计算结果为 true,则不会执行第二个表达式。如果您使用or,|则即使第一个表达式的计算结果为 true,也会计算第二个表达式。
if ($expression || $expression) {
//
}
Run Code Online (Sandbox Code Playgroud)
在这里,如果第一个表达式的计算结果为 true,则不||会让第二个表达式计算并且流程在if块中继续。仅当第一个表达式变为 时才计算第二个表达式false。
这个布尔运算与主要编程语言中的解释完全一样,而不仅仅是在 php 中。如果您想深入了解,请访问php Doc 中的逻辑运算符。
根据优先规则,逻辑运算符||具有左关联性,规定左表达式始终首先计算,如果左表达式失败,则将计算右表达式。