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中的变量的范围是文件,方法或函数,(请参阅http://php.net/manual/en/language.variables.scope.php),所以我不确定这对你不起作用.快速切入PhpStorm可以为我输出正确的响应.
使用时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 年回到这个答案,我现在看到了不同的结果:
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 中使用。