PHP try catch:在try中定义变量

iDe*_*247 15 php scope try-catch

我正在尝试调试一些代码.我希望能够显示in try中定义的变量catch.例如变量$siteId.

<?php
try {
    $siteId = 3;
    if(1 !== 2) {
        throw new Exception('1 does not equal 2!');
    }
} catch(Exception $e) {
    $moreInfo = '';
    if(isset($siteId)) {
        $moreInfo .= ' SiteId»' . $siteId;
    }
    echo 'Error' . $moreInfo . ':' . $e->getMessage();
}
?>
Run Code Online (Sandbox Code Playgroud)

我得到的回应是Error: 1 does not equal 2!代替Error SiteId»3: 1 does not equal 2!.我究竟做错了什么?

小智 9

在try/catch构造之外声明$ siteId并!empty($siteId)在catch中使用.

$siteId = null;
try {

}catch(Exceptions $e) {
  if( ! empty($siteId) ) {

  }
}
Run Code Online (Sandbox Code Playgroud)

  • PHP 5.4:我发现尝试在try块中定义一个变量,然后尝试在try块之外的某个地方访问它将导致未定义的变量通知. (5认同)

ben*_*000 6

PHP中的变量的范围是文件,方法或函数,(请参阅http://php.net/manual/en/language.variables.scope.php),所以我不确定这对你不起作用.快速切入PhpStorm可以为我输出正确的响应.


Luc*_*nte 6

使用时catch(),您无法使用 向其传递上下文catch (Exception $e) use($foo)。因此,解决方法是将 var 分配为类的状态:

private $foo;

try  {

 $foo = 'Foo';
 $this->foo = 'Foo';

} catch (Exception $e) {

   var_dump($foo); // null
   var_dump($this->foo); // 'Foo'

}
Run Code Online (Sandbox Code Playgroud)

编辑2022年

2022 年回到这个答案,我现在看到了不同的结果:

private $foo;

try  {

 $foo = 'Foo';
 $this->foo = 'Foo';

} catch (Exception $e) {

   var_dump($foo); // null
   var_dump($this->foo); // 'Foo'

}
Run Code Online (Sandbox Code Playgroud)

在所有 PHP 版本(5.4 到 8.2-rc1)中具有相同的行为:

Output for 5.4.0 - 5.4.45, 5.5.0 - 5.5.38, 5.6.0 - 5.6.40, 7.0.0 - 7.0.33, 7.1.0 - 7.1.33, 7.2.0 - 7.2.34, 7.3.0 - 7.3.33, 7.4.0 - 7.4.32, 8.0.0 - 8.0.24, 8.1.0 - 8.1.11, 8.2rc1 - rc3
string(11) "Outside Foo"
string(10) "Foo In Try"
string(12) "Foo in Class"
Run Code Online (Sandbox Code Playgroud)

所以看起来毕竟$foo可以在 catch 中使用。

https://3v4l.org/8VYp0