PHP 自动加载 : Preventing 'cannot redeclare <class>' in all constellations?

标签 php autoload fatal-error redeclaration

问题

有没有办法让 PHP 忽略类的重新声明而不是吐出一个 fatal error ?或者至少抛出一个异常?(然后我可以很容易地捕获它并继续(以及记录尝试的自动加载)。)

我猜不会, fatal error 就是 fatal error - 毕竟,在一百个案例中有九十九个是合理明智的行为 - 我可能只需要修复它被触发的实例视具体情况而定。但也许比我聪明的人已经想到了这一点。


如果您问自己“您到底为什么要这样做?”,请继续阅读。

背景

我正在开发一种工具,该工具使用反射 来聚合有关已用函数和类的特定信息。脚本的参数之一是一个可选的引导文件,使 Reflection 在自动加载时更可靠(减少最终被捕获并触发回退启发式的 ReflectionExceptions,因为类在具体文件)。

现在, Bootstrap 可以很好地加载自动加载器,并且脚本按预期运行,毫无怨言地移动数百个文件,直到我遇到障碍:

PHP Fatal error: Cannot redeclare class PHPUnit_Framework_Constraint in /usr/share/php/PHPUnit/Framework/Constraint.php on line 62

我有两个问题:

第一,我不知道是什么触发了这个。我已经调整了使用的 Bootstrap ,但只是在“无法重新声明”和“无法打开文件”之间交替,具体取决于使用的包含路径。没有中间地带,即没有不发生错误的点。尽管如此,我仍在调查。 (不过,这个问题不是问题所在。)

第二,更重要的是,引出这个问题的主题,我需要一种方法来捕捉它。我试过编写一个自定义错误处理程序,但它似乎不想为 Fatal error 工作(有点明智,有人可能会争辩)。

我打算在某个时候将这个工具发布到开源世界,这让我觉得这是一种完全不能接受的行为。对于不存在的类,我有一个回退启发式方法 - 我宁愿它们被声明一次太少而不是一次太频繁,但没有 over - 使用启发式方法,也就是说,我确实想提供使用 Bootstrap 的功能。 不破坏脚本。曾经。即使它是自动装载机历史上最糟糕的自动装载机。

(强调一下:我不想在我的自动加载器方面得到帮助。这不是这个问题的目的。)

最佳答案

避免 Cannot redeclare 的最佳选择之一是 class_exists 函数。您可以在自动加载器中使用它来防止类重新声明。使用 class_exists,您不必捕获错误,只需阻止错误即可。

实际上有两种 fatal error :可捕获的和不可捕获的。类重新声明不会触发 E_RECOVERABLE_ERROR(可捕获的错误),您无法处理它。

因此,您的问题的答案是:“您不能。”

关于PHP 自动加载 : Preventing 'cannot redeclare <class>' in all constellations?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3246168/

相关文章:

javascript - 从数据库检索图像并显示,以及如何使该图像在窗口中弹出以获得清晰的可见性。

javascript - jQuery AJAX 文件上传 PHP

php - Codeigniter 3 自动加载 Controller

php - PHP 中的 Defined() 发生 fatal error

php - 如何跳过 PHP mysqli 中的非对象错误?

php - 无法重新声明函数php

php - 如何将绝对系统路径转换为 ​​IShellFolder?

php - 更改 PDF 文件中的内容

php - ZF2 命名空间和文件系统

PHPUnit 测试失败,因为文件路径位置不正确