【问题标题】:Variable Scope in try-catch block phptry-catch 块 php 中的变量范围
【发布时间】:2016-04-22 05:58:46
【问题描述】:

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

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 作为错误。

【问题讨论】:

  • 如果您在$_session = new \Proactivve\User\Sessions($_user); 中有任何异常,则下一行将不会执行.. 所以如果条件为if(isset($start_session) && $start_session === true),则在缓存块中更改
  • @ChetanAmeta 是否可以从第一个 catch 块访问 try 块中定义的变量(即 $_session 变量)?如果是的话我想我会把它改成if($_session->startSession() === true)
  • 是的,这也是可能的。另一种方法是在 try 块之外定义变量,然后在 try 块中覆盖并在 catch 块中检查它
  • 当我在 catch 块中以 if($_session->startSession() === true) 运行 startSession 函数时收到错误 Undefined variable: _session。知道为什么吗? $_session 在这里应该在正确的范围内。

标签: php scope


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-12-05
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2012-07-24
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    相关资源
    最近更新 更多