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

时间:2011-03-14 20:29:10

标签: php symfony1 doctrine-orm fatal-error codeigniter-2

更新

  

我已经放弃了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类......因此,这是完全不相关的内容。

8 个答案:

答案 0 :(得分:5)

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

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

  2. 也许你的包含依赖项中有某个循环? (如果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,例如:

  1. require_once
  2. 使用Symfony\Component\ClassLoader\UniversalClassLoader;
  3. 然后致命错误可能是由编译器认为类的重新声明引起的。删除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' :(