J'ai creusé dans du code, et j'ai trouvé des appels à mySQL_fetch_array
. PHP est-il sensible à la casse des noms de fonctions ? Je me souviens avoir lu cela quelque part, mais je n'arrive pas à trouver de référence à ce sujet.
Réponses
Trop de publicités?Je cite este :
Remarque : les noms de fonction sont insensibles à la casse, mais il est généralement d'appeler les fonctions comme elles apparaissent comme elles apparaissent dans leur déclaration.
Il semble donc que les fonctions définies par l'utilisateur ne respectent pas la casse, il y avait un vote pour rendre les fonctions/objets sous PHP5 sensibles à la casse.
TL;DR : les noms de classes sont insensibles à la casse, mais utilisent toujours la même casse que dans la déclaration (comme pour les fonctions). De plus, l'instanciation de classes avec une casse différente de celle de leur définition peut causer des problèmes avec les autochargeurs.
De plus, les noms de classe sont insensibles à la casse :
<?php
class SomeThing {
public $x = 'foo';
}
$a = new SomeThing();
$b = new something();
$c = new sOmEtHING();
var_dump($a, $b, $c);
Ces sorties :
class SomeThing#1 (1) {
public $x =>
string(3) "foo"
}
class SomeThing#2 (1) {
public $x =>
string(3) "foo"
}
class SomeThing#3 (1) {
public $x =>
string(3) "foo"
}
Le problème est l'utilisation d'autochargeurs et de systèmes de fichiers sensibles à la casse (comme ext2/3/4), dans la mesure où vous devez appeler le nom de la classe avec la même casse que le fichier contenant la classe (et non pas avec la casse réelle du nom de la classe), ou utiliser strtolower
:
Le fichier de classe :
<?php
// filename something.php
class SomeThing {
...
}
La fonction d'autoloader ( __autoload
ou une fonction à enregistrer auprès de spl_autoload_register
)
function my_autloader($className) {
$filename = CLASSES_DIR . DIRECTORY_SEPARATOR . $className . '.php';
if (file_exists($filename)) {
require($filename);
}
}
Maintenant avec ce code :
$a = new something(); // works
$b = new SomeThing(); // does not work
$c = new SOMETHING(); // does not work
Vous pouvez faire fonctionner cela (c'est-à-dire avoir des noms de classe insensibles à la casse en utilisant un autoloader) si vous ajoutez un appel à strtolower()
dans le code de l'autoloader, mais comme pour les fonctions, il vaut mieux référencer une classe de la même manière qu'elle est déclarée, avoir le nom du fichier avec la même casse que le nom de la classe, utiliser les autoloaders, et oublier l'utilisation de strtolower
et autres.