更新:
我已经放弃了CodeIgniter,并希望从PHP构建一个围绕我的数据库应用程序的Web界面,因为没有办法摆脱这个错误......
我得到了这个例外:
Fatal error: require_once(): Cannot redeclare class doctrine\orm\abstractquery in Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php on line 190
Call Stack:
0.0007 330016 1. {main}() Q:\Digest\index.php:0
0.0058 330800 2. require_once('Q:\Digest\lib\CodeIgniter\core\CodeIgniter.php') Q:\Digest\index.php:163
0.2207 935856 3. call_user_func_array() Q:\Digest\lib\CodeIgniter\core\CodeIgniter.php:297
0.2207 935904 4. Crud->index() Q:\Digest\lib\CodeIgniter\core\CodeIgniter.php:0
0.2574 1065064 5. Crud->__getEntities() Q:\Digest\Application\controllers\crud.php:19
0.2649 1121824 6. Doctrine\ORM\AbstractQuery->getResult() Q:\Digest\Application\controllers\crud.php:49
0.2649 1121976 7. Doctrine\ORM\AbstractQuery->execute() Q:\Digest\lib\Doctrine\ORM\AbstractQuery.php:366
0.2651 1121976 8. Doctrine\ORM\Query->_doExecute() Q:\Digest\lib\Doctrine\ORM\AbstractQuery.php:528
0.2651 1121976 9. Doctrine\ORM\Query->_parse() Q:\Digest\lib\Doctrine\ORM\Query.php:223
0.2848 1185896 10. Doctrine\ORM\Query\Parser->parse() Q:\Digest\lib\Doctrine\ORM\Query.php:203
0.3089 1238704 11. Doctrine\ORM\Query\SqlWalker->getExecutor() Q:\Digest\lib\Doctrine\ORM\Query\Parser.php:311
0.3090 1239104 12. Symfony\Component\HttpFoundation\UniversalClassLoader->loadClass() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:0
0.3107 1241104 13. require_once('Q:\Digest\lib\Doctrine\ORM\Query\Exec\SingleSelectExecutor.php') Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:190
0.3108 1241440 14. Symfony\Component\HttpFoundation\UniversalClassLoader->loadClass() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:0
我正在使用Doctrine 2.0和Symfony UniversalClassLoader
,如上所示,实现数据分析脚本。为了查看结果,我设置了一个CodeIgniter项目。
这让我感到困惑的是这个例外:我已经消除了几乎所有合理的原因,并没有找到任何结果。告诉我,如果我在这里的选举中做错了什么。
如果有人对此处可能出现的问题有任何疑问,请提供帮助。如果您认为我遗漏了任何信息,请告诉我。
谢谢。
它告诉我,我无法重新定义一个班级。我已经grep了我的所有文件,而且这个类只在其特定文件中定义 “Doctrine / ORM / AbstractQuery.php”。
请注意,最初在Symfony UniversalClassLoader.php第190行调用require
时报告错误,我已将其更改为require_once
以确保文件未加载两次
由于我发现here的注释,我认为我应该分享我在Windows 7上运行PHP 5.3.5。应表示下面描述的错误/功能没有影响力。
此行为在PHP 5中已更改,因此 例如,使用Windows的路径是 首先归一化以便 C:\ PROGRA~1 \ A.php实现相同 作为C:\ Program Files \ a.php和文件 只包括一次。
require
重复我现在已经把每个库(和我自己的代码)中的每一个调用替换为函数require
到一个require_once
,并且错误保持不变。这意味着我现在可以安全地说没有对require
的调用负责。我的问题仍然是:什么是?
运行调试器绝对没有任何结果:
...
0.4658 1274904 -> Doctrine\ORM\Query\SqlWalker->getExecutor() Q:\Digest\lib\Doctrine\ORM\Query\Parser.php:311
0.4660 1275304 -> Logger::autoload() Q:\Digest\lib\Log4PHP\Logger.php:0
0.4662 1275304 -> Symfony\Component\HttpFoundation\UniversalClassLoader->loadClass() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:0
0.4663 1275384 -> strripos() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:183
0.4665 1275400 -> substr() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:185
0.4666 1275488 -> strpos() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:187
0.4667 1275520 -> substr() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:188
0.4668 1275672 -> str_replace() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:189
0.4669 1275696 -> str_replace() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:189
0.4671 1275656 -> file_exists() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:190
0.4700 1277304 -> require_once(Q:\Digest\lib\Doctrine\ORM\Query\Exec\SingleSelectExecutor.php) Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:192
0.4702 1277640 -> Logger::autoload() Q:\Digest\lib\Log4PHP\Logger.php:0
0.4703 1277640 -> Symfony\Component\HttpFoundation\UniversalClassLoader->loadClass() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:0
0.4704 1277720 -> strripos() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:183
0.4706 1277736 -> substr() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:185
0.4707 1278280 -> strpos() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:187
0.4708 1278312 -> substr() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:188
0.4709 1278464 -> str_replace() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:189
0.4711 1278488 -> str_replace() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:189
0.4712 1278448 -> file_exists() Q:\Digest\lib\Symfony\Component\HttpFoundation\UniversalClassLoader.php:190
0.5259 zu
TRACE END [2011-03-28 11:28:00]
一些额外的检查告诉我,它在崩溃时加载的文件是lib\Doctrine\ORM\Query\Exec\AbstractSqlExecutor.php
,或AbstractSqlExecutor
类......因此,这是完全不相关的内容。
答案 0 :(得分:5)
我能想到的其他可能性(在略读目前提出的答案之后)是:
也许你的源代码树中有一个符号链接? (我发现require_once()不够智能,如果路径看起来不同,你知道你正在导入同一个文件。)
也许你的包含依赖项中有某个循环? (如果A包含B,其中包含C,其中包含A,我发现require_once()不够智能,无法打破循环)。
答案 1 :(得分:3)
请检查您的服务器是否安装了APC。如果是这样,请尝试将其关闭,升级或将apc.include_once_override设置为0。
答案 2 :(得分:3)
太糟糕了,你放弃了。修复它的简单方法是:
if (!class_exists('ClassName')) {
}
文件周围。这不能解决问题,只是让症状消失。遗憾的是,Codeigniter对PHP5对象实例化并不太聪明,可能会加载你的代码两次。
答案 3 :(得分:2)
你在任何地方使用__autoload()吗?这是我唯一能想到的,除非你实际上在两个不同的文件中定义了相同的类。
答案 4 :(得分:1)
如果您已经探索了所有明显的解决方案,那么每次遇到这个问题时,都会出现缓存问题,通常是APC。
如果是apc缓存问题,要修复它,请将以下内容添加到文件顶部的顶级文件中:
apc_clear_cache();
如果问题消失,那么您就知道这就是问题所在。特别是在共享托管环境中,如果文件正在发生变化,我发现APC几乎无法使用,所以我总是把它添加到我可以调用的顶级文件中。
PS:我甚至遇到过这样的情况:APC似乎缓存了错误的文件,所以当我包含一个显然从未有过它抱怨的类的文件时它会崩溃。答案 5 :(得分:0)
如果您以多种方式加入UniveralClassLoader
,例如:
require_once
Symfony\Component\ClassLoader\UniversalClassLoader;
然后致命错误可能是由编译器认为类的重新声明引起的。删除require_once
行(如果存在),只需使用第二个选项。
答案 6 :(得分:0)
您可能在两个文件中定义了相同的类。 require_once()在这种情况下无济于事
答案 7 :(得分:0)
root
+ a.php
+ c/
+c.php
+ b.php
_ a.php _
require_once 'c/b.php'; -> will work
require_once 'c/c.php'; -> will work
_ c / b.php _
require_once 'c.php'; -> will work too 'c/c.php'!='c.php' :(