在Try/Catch块中的PHP变量作用域

41

在PHP中,变量作用域规则如何适用于Try/Catch块?在try块中声明的变量是否在块完成时失效?还是在函数/方法结束之前仍然有效?

例如:

try
{
   // This may throw an exception when created!
   $o = new Pronk();
}
catch (Exception $ex)
{
   // Handle & exit somehow; not important here
   return false;
}

$o->doPronk();

这样写有效吗?或者$o = NULL; 应该在try/catch之前设置以保持$o在作用域内吗?(我知道示例代码确实可以工作,但是我也知道PHP在作用域方面可能有些愚蠢。我的问题是,理想情况下,它应该如何工作?正确和适当的做法是什么?)


2
PHP 没有块级作用域。变量作用域是整个函数。 - Barmar
4个回答

58

您的代码是有效的。在 PHP 中,变量作用域是按函数而不是块定义的。因此,只要在同一函数内,您可以在 try 代码块内分配一个变量,并在外部访问它。


超级简单的答案。 - Maseed

2

我认为这主要是基于个人观点的。代码是正确的,只要catch块始终具有return语句,它就会按预期工作。如果catch块没有返回,流程将继续执行try/catch块之外的代码,并且它将失败,因为$o没有被初始化。由于php中缺乏块级作用域,您将能够访问$o,但该方法不存在,因为对象构建失败。


1

异常处理的主要概念是,如果“try”块内发生任何错误,代码将进入“catch”块。因此如果...

$o = new Pronk();

如果没有引发任何错误,它将在作用域内。我们不必在 try/catch 块之前声明它。你的代码完全有效。

0
只要您的 obj 正确构建,您可以期望在 try/catch 块之外使用 obj
然而,假设在构建过程中出现异常。那么您的 obj 就不会在 try 块内被构建。因此,您将无法调用 obj 上的函数,因为 obj 甚至还没有被创建。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接