我想知道以下程序流是否会阻止finally在这个try-catch-finally块中运行,因为try中有一个返回。
请原谅不良的错误检查和消毒,这只是一个模拟:
function doLogin() {
$dbh = new PDO('mysql:host=localhost;dbname=test', "root", "");
$errors = array();
$loginSuccess = false;
try {
$query = $dbh->prepare('SELECT *
FROM users
WHERE username = :username');
$query->bindParam(':username', $_POST['username'], PDO::PARAM_STR);
$result = $query->fetch(PDO::FETCH_ASSOC);
if (!password_verify($_POST['password'], $result['password'])) {
array_push($errors, 'Invalid password.');
return; // will this return prevent the finally from being run?
}
else {
$loginSuccess = true;
}
}
catch (PDOException $pdoEx) {
echo 'Error occurred ' . $pdoEx->getMessage();
}
finally {
$dbh = null;
}
}
代码编写得很糟糕,但希望你理解我的观点。
答案 0 :(得分:1)
答案是肯定的,最后的代码将会运行。
例如:
function example() {
try {
return true;
}
catch(Exception $e){
echo "error";
}
finally{
return false;
}
}
var_dump( example() );
输出:
bool(false)
它也(隐藏地)在文档中说明:
在PHP 5.5及更高版本中,也可以在之后指定finally块 抓住积木。 finally块中的代码将始终执行 在try和catch块之后,无论是否有异常 被抛出,正常执行前恢复。
根据我的理解,try块以return
语句结束。 正常执行是"暂停"最后执行了。