更新:

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

我正在使用教义2.0,与Symfony一起使用 UniversalClassLoader, 如上所述,可以实现数据分析脚本。为了查看结果,我已经设置了一个CodeIgniter项目。

这是我对这个例外感到困惑的原因:我消除了几乎所有合理的原因,什么也没发现。告诉我,我在这里的省略回合中做错了什么。

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

谢谢你。


消除重复的声明

它告诉我我无法重新定义课程。我已经grepped我的所有文件,此类定义了 仅在其特定文件中 “学说/ORM/AbstractQuery.php”。

请注意,最初在通话中报告了错误 require 在Symfony 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 一个人 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 班级...因此,完全无关的东西。

有帮助吗?

解决方案

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

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

  2. 也许您的包容依赖性中有一个周期? (如果a包含b(包括c),包括a,我发现require_once()不够聪明,无法打破周期)。

其他提示

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

太糟糕了,你放弃了。修复它的简单方法是放置:

if (!class_exists('ClassName')) {


}

围绕文件。这不能解决该错误,只会使症状消失。不幸的是,CodeIgniter对PHP5对象实例化并不太聪明,并且可能两次加载代码。

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

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

如果是APC缓存问题,请解决该问题,请在文件顶部的顶级文件中添加以下内容:

apc_clear_cache();

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

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

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

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

然后,致命误差可能是由编译器认为该类重新分配的内容引起的。消除 require_once 如果存在,则只需使用第二个选项即可。

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

 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' :(
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top