今天这个错误也发生在我身上,我开始意识到它为什么会发生(以及可能的其他原因)。
APC 通过完全限定名称正确识别每个类,其中包括类名称空间。不幸的是,您最终可能会使用不同的名称来引用同一个类。
例如:
我的代码中有一个错误的“use”语句,导入了一个非命名空间类,就好像它在命名空间中一样。
类,比如“MyClass”在命名空间“\”中,这意味着它的正确且完全限定的名称是“\MyClass”。
在某些时候,该类被其非限定名称“MyClass”引用,并被自动加载。在另一个文件中,我(错误地)在 use 语句中使用名称空间前缀引用了类,例如“use \SomeNamespace\MyClass;”。因此,该类(再次)传递给我的全局 __autoload() 方法,但名称不同。更糟糕的是,自动加载方法足够聪明,无论如何都能找到该类。
瞬间,我的脚本停止工作,所发生的只是 APC 将“[apc-error] Cannot redeclare class ...”写入 Apache Web Server error.log。我的页面不再可用。
这不是任何 APC 错误,而只是正确的行为。
在我的情况下,它有助于暂时禁用 APC(这样我的脚本将在不考虑冲突的情况下运行),并将 echo 语句挂接到我的 __autoload 函数中,生成传递的参数列表。加载了错误名称的类会很快出现,我可以修复它并重新启用 APC。
希望这可以帮助某人。