PHP自动加载:在所有星座中防止"无法重新声明<class>"?

pin*_*hic 10 php autoload fatal-error redeclaration

有没有办法让PHP 忽略类的重新声明,而不是barf up a FATAL ERROR?或者至少抛出异常?(我可以很容易地抓住它然后继续(以及尝试自动加载的日志).)

我猜不是,致命的错误是一个致命的错误 - 毕竟,在百分之九十九的案例中,这是一个相当明智的行为 - 我可能只需要修复它在一个案件上被触发的实例 - 以个案为基础.但也许比我聪明的人有这个想法.


如果你问自己" 为什么你想要这样做? ",请继续阅读.

背景

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

现在,bootstrapping正好加载了自动加载器,脚本按预期运行,在没有任何投诉的情况下移动了几百个文件,直到我遇到障碍:

PHP致命错误:无法在第62行的/usr/share/php/PHPUnit/Framework/Constraint.php中重新声明类PHPUnit_Framework_Constraint

我有两个问题:

一,我不知道是什么触发了这一点.我已经调整了所使用的引导程序,但只是在"无法重新声明"和"无法打开文件"之间交替,具体取决于所使用的包含路径.没有中间立场,即没有发生错误的点.不过,我还在调查.(但这个问题不是问题所在.)

第二,更重要的是,并且导致了这个问题的主题,我需要一种方法来捕捉它.我已经尝试编写自定义错误处理程序,但它似乎不想为Fatal errors 工作(有点明智,有人可能会争辩).

我打算在某个时候将这个工具发布到开源世界,这让我感到非常不可接受.对于不存在的类,我有一个后备启发式 - 我宁愿它们过于频繁地被宣布过一次,但是没有过度使用启发式,也就是说,我确实想要提供使用引导程序的能力.不破坏脚本.永远.即使它是自动加载器历史上最差的自动加载器.

(要强调:我不想帮助我的自动加载器.这不是这个问题的内容.)

Nar*_*adu 8

要避免的最佳选择之一Cannot redeclareclass_exists功能.您可以在自动装带器中使用它来防止类重新声明.随着class_exists你没有捕获错误,你只是阻止它.

实际上有两种致命的错误:可捕获而不能捕获.类重新声明不会触发E_RECOVERABLE_ERROR(可捕获的)并且您无法处理它.

所以,你的问题的答案是:"你做不到."