Les fonctions PHP sont-elles sensibles à la casse?


100

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.


1
Non, ils ne semblent pas l'être. la préférence est généralement en minuscules
Jason

3
Duplicata de stackoverflow.com/questions/2749781/… . Non, les fonctions ne sont pas sensibles à la casse
Bob Baddeley

Pour référence: il est enterré ici au milieu php.net/manual/en/functions.user-defined.php dans un bloc Note :.
mario

3
Je vote pour laisser cela ouvert - le titre est beaucoup plus général et explicite, il est donc susceptible d'aider plus de gens.
coreyward

Réponses:


100

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.


3
PHP5 est déjà sorti, votre seul espoir est PHP6 et je ne pense pas qu'ils franchiraient cette étape. Il casserait trop pour peu de gain.
Mark Tomlin

3
@Mark Tomlin Je ne suis pas d'accord. La meilleure pratique consiste à conserver le même cas que le manuel, donc il devrait casser peu, tout en augmentant la clarté.
Ben Dauphinee

12
sensationnel. c'est triste. bien que ImAgEcReAtEfRoMpNg () soit un bon moyen de masquer le code ...
Pontomedon

8
Puisque la citation dit "insensible à la casse", pourquoi dites-vous "Il semble donc que défini par l'utilisateur est sensible à la casse"? Si c'est une faute de frappe, vous devriez vraiment y remédier.
Barmar du

11
Hou la la! C'est vraiment sympa à découvrir après 7 ans de codage!
Daan

34

Non.

Les fonctions PHP ne sont pas sensibles à la casse.


19

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 ( __autoloadou 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 strtoloweret autres.


7

Non, ils ne sont pas sensibles à la casse, cependant, vous devez toujours utiliser la casse qui se trouve dans le manuel, par souci de cohérence.

Cependant, les variables sont sensibles à la casse.


3

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

2

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

1

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.


Re "sauver tout le cauchemar des cas de changement": Non, je crois comprendre que si le changement est jamais fait, la sensibilité à la casse serait une option, définie dans php.ini. Préservant ainsi la rétrocompatibilité.
ToolmakerSteve

-2

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!


1
c'est vraiment mauvais ... si j'allais sur my-site / myLogInPage / loginsuccess , et devais deviner ce que vous avez appelé votre fonction de réussite de connexion, je serais dans, ou capable d'effacer quelques choses ...
Tschallacka
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.