问题
有没有办法让 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/