Невозможно переопределить класс на 'require once'

обновление:

я отказался от CodeIgniter и желания построить веб-интерфейс вокруг моего приложения базы данных с PHP, так как не было никакого способа избавиться от этой ошибки...


За Исключением

Я получаю это исключение:

Fatal error: require_once(): Cannot redeclare class doctrineormabstractquery in Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php on line 190

Call Stack:
    0.0007     330016   1. {main}() Q:Digestindex.php:0
    0.0058     330800   2. require_once('Q:DigestlibCodeIgnitercoreCodeIgniter.php') Q:Digestindex.php:163
    0.2207     935856   3. call_user_func_array() Q:DigestlibCodeIgnitercoreCodeIgniter.php:297
    0.2207     935904   4. Crud->index() Q:DigestlibCodeIgnitercoreCodeIgniter.php:0
    0.2574    1065064   5. Crud->__getEntities() Q:DigestApplicationcontrollerscrud.php:19
    0.2649    1121824   6. DoctrineORMAbstractQuery->getResult() Q:DigestApplicationcontrollerscrud.php:49
    0.2649    1121976   7. DoctrineORMAbstractQuery->execute() Q:DigestlibDoctrineORMAbstractQuery.php:366
    0.2651    1121976   8. DoctrineORMQuery->_doExecute() Q:DigestlibDoctrineORMAbstractQuery.php:528
    0.2651    1121976   9. DoctrineORMQuery->_parse() Q:DigestlibDoctrineORMQuery.php:223
    0.2848    1185896  10. DoctrineORMQueryParser->parse() Q:DigestlibDoctrineORMQuery.php:203
    0.3089    1238704  11. DoctrineORMQuerySqlWalker->getExecutor() Q:DigestlibDoctrineORMQueryParser.php:311
    0.3090    1239104  12. SymfonyComponentHttpFoundationUniversalClassLoader->loadClass() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:0
    0.3107    1241104  13. require_once('Q:DigestlibDoctrineORMQueryExecSingleSelectExecutor.php') Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:190
    0.3108    1241440  14. SymfonyComponentHttpFoundationUniversalClassLoader->loadClass() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:0

Я использую доктрину 2.0, с Symfony UniversalClassLoader, Как видно выше, для реализации сценария анализа данных. Чтобы просмотреть результаты, я настроил проект CodeIgniter.

вот что меня озадачило этим исключением: я устранил почти все разумные причины и ничего не нашел. Скажи мне, если я сделал что-то не так в этом раунде.

если кто-нибудь имеет представление о том, что здесь может быть не так, пожалуйста, помогите. Если вы думаете, что есть какая-то информация, которую я упустил, пожалуйста, скажите мне.

спасибо.


устранения дублирующих объявления

он говорит мне, что я не могу переопределить класс. Я захватил все свои файлы, и этот класс определен только в конкретном файле "Doctrine/ORM / AbstractQuery.РНР."

обратите внимание, что первоначально ошибка была сообщена при вызове require в строке 190 из текущей UniversalClassLoader.php, и я изменил это на require_once чтобы убедиться, что файл не загружен дважды.


исключения с учетом регистра файловая система

из-за записки, которую я нашел здесь, я думаю, что я должен поделиться тем, что я запускаю PHP 5.3.5 в Windows 7. Это должны означает, что ошибка / функция, описанная ниже, не влияет.

это поведение изменилось в PHP 5, так например, в Windows путь нормализовано сначала так, чтобы C:PROGRA~1A.php реализуется же как C:Program Filesa.php и файл включен просто однажды.


исключения require дублирования

теперь я зашел так далеко, чтобы заменить каждый вызов в каждой библиотеке (и мой собственный код) на функцию require до require_once, и ошибка сохраняется неизменной. Это означает, что теперь я могу смело сказать, что вызов require отвечает. Мой вопрос остается: что есть?


Вывод Отладчика

запуск отладчика приносит мне абсолютно ничего:

    ...
    0.4658    1274904                       -> DoctrineORMQuerySqlWalker->getExecutor() Q:DigestlibDoctrineORMQueryParser.php:311
    0.4660    1275304                         -> Logger::autoload() Q:DigestlibLog4PHPLogger.php:0
    0.4662    1275304                         -> SymfonyComponentHttpFoundationUniversalClassLoader->loadClass() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:0
    0.4663    1275384                           -> strripos() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:183
    0.4665    1275400                           -> substr() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:185
    0.4666    1275488                           -> strpos() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:187
    0.4667    1275520                           -> substr() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:188
    0.4668    1275672                           -> str_replace() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:189
    0.4669    1275696                           -> str_replace() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:189
    0.4671    1275656                           -> file_exists() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:190
    0.4700    1277304                           -> require_once(Q:DigestlibDoctrineORMQueryExecSingleSelectExecutor.php) Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:192
    0.4702    1277640                             -> Logger::autoload() Q:DigestlibLog4PHPLogger.php:0
    0.4703    1277640                             -> SymfonyComponentHttpFoundationUniversalClassLoader->loadClass() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:0
    0.4704    1277720                               -> strripos() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:183
    0.4706    1277736                               -> substr() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:185
    0.4707    1278280                               -> strpos() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:187
    0.4708    1278312                               -> substr() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:188
    0.4709    1278464                               -> str_replace() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:189
    0.4711    1278488                               -> str_replace() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:189
    0.4712    1278448                               -> file_exists() Q:DigestlibSymfonyComponentHttpFoundationUniversalClassLoader.php:190
    0.5259 zu
TRACE END   [2011-03-28 11:28:00]

некоторая дополнительная проверка говорит мне, что файл загружается во время сбоя libDoctrineORMQueryExecAbstractSqlExecutor.php или AbstractSqlExecutor класса... таким образом, нечто совершенно не связанное.

8 ответов


другие возможности, которые я могу придумать (после беглого просмотра ответов, предложенных до сих пор):

  1. может есть ссылка где-то в вашем исходном дереве? (Я обнаружил, что require_once () недостаточно умен, чтобы знать, что вы импортируете тот же файл, если путь выглядит иначе).

  2. может быть, где-то в ваших зависимостях включения есть цикл? (если A включает B, который включает C, который включает A, я обнаружил, что require_once() не достаточно умен, чтобы разорвать цикл).


пожалуйста, проверьте, установлен ли ваш сервер APC. Если это так, попробуйте отключить его, обновить или установить apc.установка include_once_override до 0.


вы используете _ _ 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' :(