Невозможно переопределить класс для require_once - PullRequest
12 голосов
/ 14 марта 2011

ОБНОВЛЕНИЕ :

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


Исключение

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

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.

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

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

Спасибо.


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

Это говорит мне, что яне может переопределить класс.Я очистил все мои файлы, и этот класс определен только в его конкретном файле"Doctrine / ORM / AbstractQuery.php".

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


Устранение чувствительной к регистру файловой системы

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

Это поведение изменилось в 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 ]

5 голосов
/ 25 июля 2011

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

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

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

3 голосов
/ 16 июня 2011

Жаль, что ты сдался.Простой способ исправить это - поместить:

if (!class_exists('ClassName')) {


}

вокруг файла.Это не исправляет ошибку, а только устраняет симптом.Codeigniter, к сожалению, не слишком умел в отношении создания объектов PHP5 и может загружать ваш код дважды.

3 голосов
/ 29 марта 2011

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

2 голосов
/ 31 марта 2011

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

1 голос
/ 11 марта 2015

Если вы исследовали все очевидные решения, то каждый раз, когда я сталкивался с этой проблемой, это была проблема с кэшированием, обычно с APC.

Если это проблема с кэшированием apc, для ее исправления добавьте в файл верхнего уровня в верхней части файла следующее:

apc_clear_cache();

Если проблема исчезнет, ​​то вы знаете, что это была проблема. В частности, в средах с общим хостингом, если файлы меняются, я обнаружил, что APC практически непригоден, поэтому я всегда добавляю его в файл верхнего уровня, который я могу вызвать.

PS: Я даже сталкивался с ситуациями, когда кажется, что APC кэшировал неправильный файл, поэтому он вылетает, когда я включаю файл, у которого явно не было класса, на который он жалуется.

0 голосов
/ 18 февраля 2015
 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' :(
0 голосов
/ 31 марта 2011

у вас может быть один и тот же класс, определенный в двух файлах.require_once () в этом случае не поможет

0 голосов
/ 15 марта 2011

Если вы включаете UniveralClassLoader несколькими способами, например:

  1. - require_once
  2. , используйте Symfony\Component\ClassLoader\UniversalClassLoader;

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

...