Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Php: how to resolve "Cannot redeclare class" when there's no "previously declared"

Tags:

php

I want to test the phpDocumentor-alpha, and there's a problem that some people seems not to have:

# sudo pear uninstall phpdoc/phpDocumentor-alpha
uninstall ok: channel://pear.phpdoc.org/phpDocumentor-2.0.0a6
olivier@olivier-ubuntu ~/Documents/pizzas/dev # phpdoc --help
bash: /usr/bin/phpdoc: Aucun fichier ou dossier de ce type
# 
# sudo pear install --alldeps -f phpdoc/phpDocumentor-alpha
downloading phpDocumentor-2.0.0a6.tgz ...
Starting to download phpDocumentor-2.0.0a6.tgz (1,107,853 bytes)
..................................done: 1,107,853 bytes
install ok: channel://pear.phpdoc.org/phpDocumentor-2.0.0a6
# phpdoc --help
PHP Fatal error:  Cannot redeclare class phpDocumentor\Plugin\Core\Listener in /usr/share/php/phpDocumentor/src/phpDocumentor/Plugin/Core/Listener.php on line 194

Fatal error: Cannot redeclare class phpDocumentor\Plugin\Core\Listener in /usr/share/php/phpDocumentor/src/phpDocumentor/Plugin/Core/Listener.php on line 194
# 

Ok, i can avoid that problem with:

if ( !class_exists('MTIHelperEstadosLocal') ) {...}

But this is just an ugly workaround. I'd like to know if there's a way to know where the declaration was firt (= which include or whatever).

Any idea?

like image 997
Olivier Pons Avatar asked Dec 06 '22 13:12

Olivier Pons


2 Answers

Here's the simple solution:

print_r(get_declared_classes());
like image 153
Olivier Pons Avatar answered Dec 21 '22 23:12

Olivier Pons


Depending on your OS, and how you have constructed the path to your document root, there may be an issue with capitals versus lower case letters in the path name. This often trips me up on large CMS projects such as drupal on Mac OSX

// Insert this debug code before require statement.
if (class_exists('classInQuestion')) {
  $reflector = new ReflectionClass('classInQuestion');
  echo $reflector->getFileName() . ' ' . $reflector->getStartLine() . "\n";
  echo $newClassFile;
  exit();
}
// Normal pre-existing require statement
require_once $newClassFile
like image 30
Bryan Hazelbaker Avatar answered Dec 21 '22 23:12

Bryan Hazelbaker