如果我有像这样的程序流程,最终会运行代码吗?

时间:2014-06-18 15:11:49

标签: php

我想知道以下程序流是否会阻止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;
    }

}

代码编写得很糟糕,但希望你理解我的观点。

1 个答案:

答案 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语句结束。 正常执行是"暂停"最后执行了。