gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:54:01 26 4
gpt4 key购买 nike

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

在我的应用程序中,我使用命名空间。所有类都在单独的源代码文件中。与此特定情况相关的代码分布在 3 个类中。

“最外层”类是一个调度程序(或路由器),它将调度调用包装在一个 try-catch 块中。分派(dispatch)的请求调用第三个类中的方法,该方法运行代码(包装在 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();

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

我可能对宽松的 PHP 编译器期望过高,但它有助于跟踪编译器很容易发现的愚蠢错误。

1 如果 $a->doSomething()run.phptry..catch 包围条款, Exception会(或至少可能)在那里被捕获,因为它会沿着堆栈滴入。

最佳答案

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

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

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

关于PHP:命名空间类、类加载和异常导致奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6660269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com