try-catch块php中的变量范围

时间:2016-04-22 05:58:47

标签: php scope

我有以下代码来确定是否应该根据登录信息创建新会话;

try {
    $_session = new \Proactivve\User\Sessions($_user);
    $start_session = $_session->startSession();
}
catch (\Proactivve\Exceptions\ProactivveAuthenticationException $e) {
    if($start_session === true) {
        // Successful login
        return array(/* ... */);
    }
    return array(/* ... */);
}

其中我需要从try块检查$start_session的返回值;但是,我从PHP(v5.6.11)获得变量的"Undefined variable"错误。我一直认为PHP中的变量是作用于文件,方法或函数的范围,而不是块。为什么我应该可以访问变量时收到此错误?

我在AuthenticationException异常捕获器中检查成功登录的原因是,在创建\Proactivve\User\Sessions类的新实例时,我检查现有会话并抛出认证异常(如果有)找不到,因此我需要检查此catch块内部以确定用户尚未登录。

更新:

try {
    $_session = new \Proactivve\User\Sessions($_user);
}
catch (\Proactivve\Exceptions\ProactivveAuthenticationException $e) {
    if($_session->startSession() === true) {
        // Successful login
        return array(/* ... */);
    }
    return array(/* ... */);
}

这个新方法理解在抛出异常之后,PHP停止执行try块中的代码并在catch块中启动会话;但是,现在我收到Undefined variable: _session作为错误。

1 个答案:

答案 0 :(得分:1)

如果\Proactivve\User\Sessions()抛出异常,则try块中的其他代码都不会被执行。不会将任何内容分配给$_session,并且将完全跳过以下行。

范围界定不是你的问题,问题是永远不会创建变量。如果您需要catch块中的特定值,则需要在不会被异常中断的上下文中创建它们。