Невозможно переопределить класс на '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 ответов
другие возможности, которые я могу придумать (после беглого просмотра ответов, предложенных до сих пор):
может есть ссылка где-то в вашем исходном дереве? (Я обнаружил, что require_once () недостаточно умен, чтобы знать, что вы импортируете тот же файл, если путь выглядит иначе).
может быть, где-то в ваших зависимостях включения есть цикл? (если A включает B, который включает C, который включает A, я обнаружил, что require_once() не достаточно умен, чтобы разорвать цикл).
пожалуйста, проверьте, установлен ли ваш сервер APC. Если это так, попробуйте отключить его, обновить или установить apc.установка include_once_override до 0.
вы используете _ _ autoload () где-нибудь? Это единственное, что я могу придумать, если у вас на самом деле нет одного класса, определенного в двух разных файлах.
Если вы изучили все очевидные решения, то каждый раз, когда я сталкивался с этой проблемой, это была проблема кэширования, как правило, с APC.
Если это проблема кэширования apc, чтобы исправить ее, добавьте следующее в файл верхнего уровня в верхней части файла:
apc_clear_cache();
Если проблема исчезнет, тогда вы знаете, что это была проблема. В частности, в средах общего хостинга, если файлы меняются, я нашел APC почти непригодным для использования, поэтому я всегда добавляю, что в файл верхнего уровня, который я могу вызвать.
PS: Я даже сталкивался с ситуациями, когда кажется, что APC кэшировал неправильный файл, так что он падает, когда я включаю файл, который явно никогда не имел класса, на который он жалуется.
если вы включаете UniveralClassLoader
несколькими способами, такими как:
- через
require_once
- использовать
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' :(