无法在'require_once'上重新定义课程

wen*_*wen 12 php symfony1 fatal-error doctrine-orm codeigniter-2

更新:

我已经放弃了CodeIgniter,并希望从PHP构建一个围绕我的数据库应用程序的Web界面,因为没有办法摆脱这个bug ...


例外

我得到这个例外:

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
Run Code Online (Sandbox Code Playgroud)

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

这让我感到困惑的是这个例外:我已经消除了几乎所有合理的原因,并没有发现任何东西.告诉我,如果我在这里的选举中做错了什么.

如果有人对这里可能出现的问题有任何疑问,请帮忙.如果您认为我遗漏了任何信息,请告诉我.

谢谢.


消除重复声明

它告诉我,我不能重新定义一个类.我已经grep了我的所有文件,这个类只在其特定文件 "Doctrine/ORM/AbstractQuery.php"中定义.

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


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

由于我在这里发现的注释,我认为我应该分享我在Windows 7上运行PHP 5.3.5.这应该意味着下面描述的bug /功能没有任何影响.

此行为在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]
Run Code Online (Sandbox Code Playgroud)

一些额外的检查告诉我它崩溃时正在加载的文件 lib\Doctrine\ORM\Query\Exec\AbstractSqlExecutor.php,或AbstractSqlExecutor类......因此,一些完全不相关的东西.

Bur*_*ent 5

可惜你放弃了。修复它的简单方法是:

if (!class_exists('ClassName')) {


}
Run Code Online (Sandbox Code Playgroud)

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

  • 你不是说“if (!class_exists(...”吗? (3认同)

Pet*_*ter 5

我能想到的其他可能性(在略读目前提出的答案之后)是:

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

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