Avez-vous déjà rencontré l'erreur T_PAAMAYIM_NEKUDOTAYIM ? Drôle de nom n'est-ce pas ? Cette constante PHP est utilisée pour définir l'opérateur de résolution de portée "::" (scope resolution operator), comme par exemple dans le cas suivant :
Classe::element
"Parse error: parse error, expecting 'T_PAAMAYIM_NEKUDOTAYIM' in ..."
Évidemment, quand on rencontre ce type d'erreur, le nom n'est pas très explicite et il faut fouiller pour comprendre le message. Il faut savoir qu'en hébreux, Paamayim veut dire "double / twice" et Nekudotaim est "colon", donc on fait référence à l'opérateur ::. En remontant plus loin dans l'histoire du développement, on découvre que Andi Gutmans and Zeev Suraski, les créateurs du Zend Engine de PHP et Zend Technologies, sont israéliens et ont étudié au Technion Israel Institute of Technology. D'ailleurs, le nom Zend est vient de la fusion de leurs prénoms : ZEev et aNDi.
Ça explique certaines choses. Mais pourquoi ne pas avoir standardisé les noms en anglais et avoir conservé celle-ci ? En fait, la question est aussi de savoir s'il existe d'autres noms curieux utilisés dans les entrailles du code source C. Alors cherchons les!
Sur la page de téléchargement de PHP, j'ai téléchargé le code source complet, php-5.2.9.tar.gz, soit l'archive stable la plus récente. Après l'avoir extraite, je me suis débrouillé pour utiliser une combinaison des commandes grep et sed pour effectuer les recherches.
D'abord, j'ai voulu obtenir la liste des fichiers et leurs lignes où on trouvait des constantes dont le nom débutait par T_. J'ai utilisé grep avec les options de recherches récursives (-r) dans les sous-répertoires et j'ai spécifié la recherche de mots complets (-w). Ensuite, j'ai défini une simple expression régulière et j'ai envoyé le résultat dans un fichier :
grep -r -w ^.*\bT_.*\b php-5.2.9 > all_lines_with_t_.txt
À partir du résultat, j'ai lancé la commande sed pour extraire les constantes trouvées. J'ai utilisé une regexp (-e), la substitution (s/old/new/) et la capture de pattern (\1).
sed 's/^.*\(\bT_\w*\b\).*$/\1/' all_lines_with_t_.txt > all_t.txt
Finalement j'ai effectué un tri avec filtre unique (sort -u) sur le fichier pour ne conserver qu'une seule occurence de chaque constante. Si vous êtes sous Windows, faites attention car il y a une autre fonction sort native. Assurez-vous d'utiliser celle Unix (Cygwin ou UnxUtils).
sort -u all_t.txt > sorted.txt
En jetant un coup d'oeil au fichier final, on peut noter 137 constantes différentes mais la seule qui porte un nom bizarre est T_PAAMAYIM_NEKUDOTAYIM. Ok, j'avoue que je ne sais pas encore ce que T_MX et T_FMT_AMPM veulent dire mais ce sont certainement des abréviations.
Qu'est-ce que ça représenterait de changer toutes ces constantes par un nom plus explicite ? J'imaginais pouvoir y arriver en le remplaçant par T_DOUBLE_COLON mais cette constante existe déjà dans un autre contexte. Alors pourquoi ne pas utiliser T_SRO ou T_SCOPE_RESOLUTION_OP ?
Pour trouver toutes les occurences de la constante dans l'ensemble du code source :
grep -r -w T_PAAMAYIM_NEKUDOTAYIM php-5.2.9 > paamayim_occurences.txt
Seulement 66 occurences trouvées. Ça devrait pouvoir se remplacer facilement.
dimanche 15 mars 2009
2 réponses à "Erreur curieuse en PHP : Paamayim Nekudotayim"
S'abonner à :
Publier des commentaires (Atom)
oui c'est vraiment curieux,
je trouve même très curieux le fait de remonter l'histoire pour l'explication, .. n'est ce pas Indiana Jones
Je suis content de voir que ça t'a intéressé toi aussi :-)