J'étais en train de fouiller dans du code et j'ai trouvé des appels mySQL_fetch_array
. PHP est-il sensible à la casse sur les noms de fonctions? Je me souviens avoir lu ceci quelque part mais je n'arrive pas à y trouver de référence.
J'étais en train de fouiller dans du code et j'ai trouvé des appels mySQL_fetch_array
. PHP est-il sensible à la casse sur les noms de fonctions? Je me souviens avoir lu ceci quelque part mais je n'arrive pas à y trouver de référence.
Réponses:
Je cite ceci :
Remarque: les noms de fonction ne sont pas sensibles à la casse, bien qu'il soit généralement bon d'appeler des fonctions telles qu'elles apparaissent dans leur déclaration.
Donc, il semble que les fonctions définies par l'utilisateur ne sont pas sensibles à la casse, il y a eu un vote pour rendre les fonctions / objets sous PHP5 sensibles à la casse.
TL; DR: les noms de classe sont insensibles à la casse, mais utilisent toujours la même casse que dans la déclaration (comme pour les fonctions). En outre, l'instanciation de classes avec une casse différente telle qu'elles ont été définies peut entraîner des problèmes avec les chargeurs automatiques.
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);
Cela produit:
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 de chargeurs automatiques et de systèmes de fichiers sensibles à la casse (comme ext2 / 3/4), en ce sens que vous devez appeler le nom de la classe avec la même casse que le fichier contenant la classe est nommé (pas comment le nom de la classe est réellement casé), ou utilisez strtolower
:
Le fichier de classe:
<?php
// filename something.php
class SomeThing {
...
}
La fonction de chargeur automatique ( __autoload
ou une fonction pour s'enregistrer 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 ce travail (c.-à-d. Avoir effectivement des noms de classe insensibles à la casse en utilisant un chargeur automatique) si vous avez ajouté un appel à strtolower()
dans le code du chargeur automatique, mais comme pour les fonctions, il est simplement préférable de référencer une classe de la même manière qu'elle est déclarée, avoir le nom de fichier avec la même casse que le nom de la classe, utiliser des chargeurs automatiques et oublier d'utiliser strtolower
et autres.
En PHP, les variables sont sensibles à la casse mais les fonctions n'ont aucun problème comme celui-ci. Vous pouvez utiliser les instructions suivantes pour afficher la sortie, toutes afficheront le même résultat.
<?php
Echo "This is a test script";
ECHO "This is a test script";
echo "This is a test script";
?>
D'un autre côté, si vous changez la sensibilité à la casse des variables, l'erreur s'affichera.
Exemple:
<?php
$a=5;
echo $A;// It will show the error.
?>
Production:
Notice: Undefined variable: A in C:\xampp\htdocs\test.php on line 3
Et les noms de méthodes sont également insensibles à la casse. par exemple:-
<?php
class C {
public function method() { }
public function METHOD() { }
}
production:
PHP Fatal error: Cannot redeclare C::METHOD() in ....php on line 6
En conclusion de la réponse de chacun. Même si PHP n'exige pas la cohérence de la casse des caractères dans toutes les instances, même jusqu'à présent dans PHP5.
La meilleure pratique sera
utilisez toujours les mêmes cas lorsque vous faites référence à des variables (son «obligatoire) ou des fonctions (son« facultatif, mais recommandé).
Vous ne savez jamais peut-être qu'un jour le vote passera et vous épargnerez le cauchemar de changer les cas dans vos applications créées il y a quelques années qui nécessitent une mise à jour en PHP.
J'espère que cela aide de toute façon.
Peut-être que c'est trop tard, mais ...
Tout le monde le sait déjà ici: le moteur PHP ne se soucie pas de la casse des lettres.
Et il y a le vote sur PHP bugtracker, où la majorité dit: "Oui, je suis pro case sensetivity".
Mais je suis contre, car dans mon framework MVC, j'appelle l'action du contrôleur:
$currentController = new $controller($parameters);
$currentAction = $currentController->{$action}();
$ controller et $ action sont exécutés à partir de l'URL tels quels.
Pensez, si un utilisateur publie un lien vers mon site: https: // mon-site / MyPartnerController / MyPartnerGallery
tandis que la classe est nommée myPartnerController ...
Cela signifie que personne n'accède jamais à cette page si les noms de classes et de fonctions de PHP sont sensibles à la casse.
Oui, j'utilise toujours tous les noms du code tels que déclarés. Mais je prie pour qu'ils ne rendent jamais les noms des fonctions et des classes sensibles à la casse.
Je vous remercie!