13

更新

我已经放弃了 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

UniversalClassLoader如上所示,我正在使用 Doctrine 2.0 和 Symfony来实现数据分析脚本。为了查看结果,我设置了一个 CodeIgniter 项目。

这就是我对这个例外感到困惑的地方:我已经消除了几乎所有合理的原因,但一无所获。如果我在这里的淘汰赛中做错了什么,请告诉我。

如果有人对这里可能出现的问题有任何线索,请提供帮助。如果您认为我遗漏了任何信息,也请告诉我。

谢谢你。


消除重复声明

它告诉我我不能重新定义一个类。我已经 grepped 我的所有文件,并且这个类仅在其特定文件“Doctrine/ORM/AbstractQuery.php”中定义。

请注意,最初错误是在requireSymfony UniversalClassLoader.php 的第 190 行调用时报告的,我已将其更改require_once为确保文件不会加载两次。


消除区分大小写的文件系统

由于我在这里找到的注释,我认为我应该分享我在 Windows 7 上运行 PHP 5.3.5。这应该意味着下面描述的错误/功能没有影响。

这种行为在 PHP 5 中发生了变化,因此例如在 Windows 中,路径首先被规范化,这样 C:\PROGRA~1\A.php 的实现方式与 C:\Program Files\a.php 相同,并且文件只包含一次.


消除require重复

我现在已经将每个库(和我自己的代码)中的每个调用都替换require为 one to 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类......因此,一些完全不相关的东西。

4

8 回答 8

7

我能想到的其他可能性(在浏览了到目前为止提出的答案之后)是:

  1. 也许在你的源代码树的某个地方有一个符号链接?(我发现 require_once() 不够聪明,无法知道如果路径看起来不同,您正在导入同一个文件)。

  2. 也许您的包含依赖项中有一个循环?(如果 A 包含 B 包含 C 包含 A,我发现 require_once() 不够聪明,无法打破循环)。

于 2011-07-25T18:30:40.230 回答
4

可惜你放弃了。解决它的简单方法是:

if (!class_exists('ClassName')) {


}

文件周围。这并不能修复错误,只会使症状消失。不幸的是,Codeigniter 在 PHP5 对象实例化方面不太聪明,可能会加载您的代码两次。

于 2011-06-16T02:22:17.307 回答
3

请检查您的服务器是否安装了 APC。如果是这样,请尝试将其关闭,升级或将 apc.include_once_override 设置设置为 0。

于 2011-03-29T12:14:19.073 回答
2

你在任何地方使用 __autoload() 吗?这是我唯一能想到的,除非您实际上在两个不同的文件中定义了相同的类。

于 2011-03-31T16:47:25.660 回答
1

如果您已经探索了所有明显的解决方案,那么每次我遇到这个问题时,它都是一个缓存问题,通常与 APC 相关。

如果是 apc 缓存问题,要修复它,请将以下内容添加到文件顶部的顶级文件中:

apc_clear_cache();

如果问题消失了,那么您就知道这就是问题所在。特别是在共享主机环境中,如果文件发生变化,我发现 APC 几乎无法使用,因此我总是将其添加到我可以调用的顶级文件中。

PS:我什至遇到过 APC 似乎缓存了错误文件的情况,因此当我包含一个显然从未有过它抱怨的类的文件时它会崩溃。

于 2015-03-10T23:06:34.397 回答
0

您可能在两个文件中定义了相同的类。require_once() 在这种情况下无济于事

于 2011-03-31T14:48:10.937 回答
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' :(
于 2015-02-18T11:01:49.660 回答
0

如果您UniveralClassLoader以多种方式包含,例如:

  1. 通过require_once
  2. 利用Symfony\Component\ClassLoader\UniversalClassLoader;

那么致命错误可能是由编译器认为类的重新声明引起的。require_once如果存在则删除行,然后使用第二个选项。

于 2011-03-15T10:45:08.170 回答