【发布时间】: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 在这里应该在正确的范围内。