PHP:命名空间类,类加载和异常会导致奇怪的行为

时间:2011-07-12 06:23:37

标签: php debugging exception namespaces

我目睹了一些关于PHP在最近项目中的异常处理的奇怪行为。案例如下。

在我的应用中,我使用命名空间。所有类都在单独的源代码文件中。与此特定案例相关的代码分为3个类别。

“最外层”类是一个调度程序(或路由器),它将调度调用包装在try-catch块中。调度请求调用第三个类中的方法,该类运行代码(包装在try-catch块中),这会导致异常。

因为我在发生错误的类中省略了use Exception;语句,抛出的异常一直涓涓细流回到最外层(调度程序),它被捕获 - 导致我划伤我的脑袋为什么导致错误的代码周围的捕获不起作用。

对我来说,这似乎很奇怪。从逻辑上讲,PHP应该在这种情况下(IMO)抛出Class not found异常/错误,导致我在代码中出现实际错误,而不是尽可能地“保持活着”。

这应该作为错误提交,还是这种预期行为?

编辑:代码示例

档案:class-a.php

<?php 
namespace hello\world;

class classA {
    protected $b;

    public function __construct() {
        $this->b = new \hello\world\classB();
    }

    public function doSomething() {
        try {
            $this->b->throwException();
        } catch (Exception $e) {

        }
    }
}

档案:class-b.php

<?php 
namespace hello\world;

class classB
{
    public function throwException() {
        throw new \Exception("bar closed");
    }
}

档案:run.php

<?php 
include 'class-a.php';
include 'class-b.php';

$a = new \hello\world\classA();

$a->doSomething();

ClassB throw\Exception中的ClassB::doSomething(),其中ClassA有一个catch - 子句,但因为ClassA没有声明use Exceptioncatch (\Exception)catch不匹配,执行以Uncaught exception错误 1 结束。但在我看来,它应该导致Class not found错误。

我可能期望过多的宽松PHP编译器,但它有助于追踪编辑器应该很容易发现的愚蠢错误。

1 如果$a->doSomething()中的run.phptry..catch条款包围,则Exception会(或至少可能)被捕获那里,因为它涓涓细流。

1 个答案:

答案 0 :(得分:3)

PHP的异常捕获机制不会验证您捕获的类实际存在。

在函数中使用typehinting时它表现出相同的行为,所以我怀疑它只是将异常/函数类型提示转换为字符串或其他东西,并将其与相关对象的类型进行比较。

这是否是一个错误是值得怀疑的。我个人认为它应该归类为一个bug,但PHP有各种不稳定的行为:D