mardi 24 mars 2009
Avez-vous déjà rencontré l'erreur PHP suivante ?
Fatal error: Cannot redeclare class test in path.php on line 2
C'est le genre de message qui apparaît lorsqu'on tente d'inclure deux fois le même fichier avec include() ou require().
require('myClass.php');Heureusement, on peut facilement corriger le tout en utilisant require_once() pour éviter la redéfinition.
require('myClass.php');
require_once('myClass.php');Dans bon nombre de projet, ce n'est pas rare qu'une librairie contienne des dépendances ou qu'elles en incluent d'autres. C'est exactement ce qu'on fait dans nos projets : on inclut des librairies externes et nos propres librairies. Si on déclare une nouvelle classe dans un projet, c'est possible qu'un autre fichier en contienne une du même nom. Et nous n'avons pas le contrôle sur la façon que choisissent les autres développeurs pour les nommer. Le message d'erreur est assez explicite pour indiquer la redéfinition d'une classe, mais comment savoir où se trouve la première déclaration ?
require_once('myClass.php');
Un truc très simple pour déboguer : il suffit de déclarer une classe vide du même nom et placer cette déclaration avant tous les includes de notre projet. En faisant cela, notre classe deviendra la principale (la première déclarée) et celle cachée dans les profondeurs d'une librairie sera considérée comme celle redéfinie. Le message d'erreur permettra de connaître l'emplacement exact de la classe externe et nous pourrons ensuite décider des meilleures actions à prendre.
// forcer une déclaration videFatal error: Cannot redeclare class test in path\external\library\test.php on line 2
class test {}
require_once('external.library.with.test.class.php');
require_once('my.test.class.php');
Dans d'autres circonstances, ça peut parfois être pratique d'avoir un aperçu de toutes les classes déclarées dans un projet en les listant comme ceci :
echo '<pre>';De la même façon, on pourra obtenir la liste de tous les fichiers inclus dans notre projet, incluant leur chemin complet :
print_r(get_declared_classes());
echo '</pre>';
echo '<pre>';
print_r(get_included_files());
echo '</pre>';