Non è possibile ridefinire classe su 'require_once'
-
24-10-2019 - |
Domanda
Aggiorna :
ho abbandonato CodeIgniter, e il desiderio di costruire un'interfaccia web intorno alla mia applicazione di database da PHP, come non c'era modo di sbarazzarsi di questo bug ...
L'eccezione
ottengo questa eccezione:
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
Sto usando Doctrine 2.0, con il UniversalClassLoader
Symfony, come si può vedere sopra, per implementare uno script di analisi dei dati. Per visualizzare i risultati, ho predisposto un progetto di CodeIgniter.
Ecco quello che mi ha sconcertato con questa eccezione: ho eliminato quasi tutti ragionevolmente cause, e ha trovato nulla. Dimmi se ho fatto qualcosa di sbagliato nei turni elemination qui.
Se qualcuno ha qualche indizio di sorta su ciò che potrebbe andare male qui, si prega di aiuto. Se si pensa che ci sono tutte le informazioni che ho lasciato fuori, anche, la prego di dirmi.
Grazie.
Eliminare duplicati dichiarazioni
E mi dice che non posso ridefinire una classe. Ho grepped tutti i miei file, e questa classe è definita solo nel suo specifico file "Dottrina / ORM / AbstractQuery.php".
Si noti che inizialmente l'errore è stato segnalato alla chiamata a require
alla linea 190 del Symfony UniversalClassLoader.php, e ho cambiato questo per require_once
per assicurarsi che il file non viene caricato due volte.
Eliminando il file system maiuscole e minuscole
A causa della nota che ho trovato href="http://www.php.net/manual/en/function.include-once.php" qui , credo è che avrei dovuto condividere che sto correndo PHP 5.3.5 su Windows 7. Questo dovrebbe significa che il bug / funzione descritta di seguito è di alcuna influenza.
Questo comportamento è cambiato in PHP 5, così ad esempio in Windows il percorso è normalizzato, in modo che C: \ PROGRA ~ 1 \ A.php si realizza lo stesso come C: \ Program Files \ a.php e il file è incluso solo una volta.
Eliminare require
duplicazione
Ho ormai andato al punto di sostituire ogni singola chiamata in ogni libreria (e il mio codice) per la funzione require
a uno a require_once
, ei persiste errore invariato. Questo significa che ora posso dire con sicurezza che nessuna chiamata a require
è responsabile. La mia domanda rimane: qual è
Debugger uscita ??h2>
mi Esecuzione di un debugger porta assolutamente nulla:
...
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]
Alcuni ulteriori ispezioni mi dice che il file è di carico, mentre si arresta è lib\Doctrine\ORM\Query\Exec\AbstractSqlExecutor.php
, o la classe AbstractSqlExecutor
... quindi, qualcosa di completamente estraneo.
Soluzione
Le altre possibilità che posso pensare (dopo scrematura le risposte proposte finora) sono:
-
Forse c'è un link simbolico da qualche parte nel vostro albero dei sorgenti? (Ho scoperto che require_once () non è abbastanza intelligente per sapere che si sta importando lo stesso file se il percorso è diverso).
-
Forse c'è un qualche ciclo nelle dipendenze di inclusione? (Se A include B che comprende C che include una, ho trovato che require_once () non è abbastanza intelligente per rompere il ciclo).
Altri suggerimenti
Si prega di verificare se il server è installato APC. Se quindi cercate di spegnerlo, aggiornare o set apc.include_once_override impostazione su 0.
Peccato che ha rinunciato. Il modo più semplice per risolvere il problema sarebbe quello di mettere:
if (!class_exists('ClassName')) {
}
intorno al file. Questo non risolve il bug, fa solo il sintomo andare via. CodeIgniter purtroppo non è troppo intelligente su PHP5 istanze di oggetti, e può essere il caricamento del codice di due volte.
Si sta utilizzando __autoload () da qualche parte? Questo è l'unica cosa che mi viene in mente, a meno che in realtà hanno la stessa classe definita in due file differenti.
Se avete esplorato tutte le soluzioni ovvie, quindi ogni volta che ho eseguito in questo problema, è stato un problema di caching, in genere con APC.
Se si tratta di un problema di caching apc, per risolvere il problema, aggiungere il seguente al file di livello superiore nella parte superiore del file:
apc_clear_cache();
Se il problema scompare, poi si sa che che era il problema. In particolare sugli ambienti di hosting condiviso, se i file stanno cambiando, ho trovato APC quasi inutilizzabile, quindi ho sempre aggiungere che in un file di livello superiore che posso chiamare.
PS:. Ho anche correre in situazioni in cui sembra che APC ha memorizzato nella cache il file sbagliato, in modo che si blocca quando includo un file che chiaramente non ha mai avuto la classe è lamentarsi
Se siete tra cui UniveralClassLoader
in vari modi, come ad esempio:
- attraverso
require_once
- uso
Symfony\Component\ClassLoader\UniversalClassLoader;
quindi l'errore fatale potrebbe essere causato da ciò che il compilatore considera la ridichiarazione della classe. Rimuovere la linea require_once
se esiste e basta usare la seconda opzione.
si può avere la stessa classe definita in due file. require_once () non aiuta in questo caso
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' :(