Booléens majuscules et minuscules en PHP

135

Quand j'apprenais PHP, j'ai lu quelque part que vous devriez toujours utiliser les versions majuscules des booléens, TRUEet FALSE, parce que les versions minuscules "normales", trueet false, n'étaient pas "sûres" à utiliser.

Cela fait maintenant plusieurs années, et chaque script PHP que j'ai écrit utilise la version majuscule. Maintenant, cependant, je remets cela en question, car j'ai vu beaucoup de PHP écrit avec la version minuscule (ie Zend Framework).

Y a-t-il déjà eu une raison d'utiliser la version majuscule ou est-il parfaitement acceptable d'utiliser la minuscule?

edit: J'ai oublié de mentionner que cela s'applique également à NULLet null.

Austin Hyde
la source
4
Il existe un certain nombre de sites disant que l'écrire en minuscules est censé être «beaucoup plus rapide», mais sans citer de sources sérieuses. Intéressé de voir si quelque chose se passe.
Pekka
2
Ce n'est pas vrai. Je l'ai testé avec 5 millions d'itérations et ils ont tous deux donné les mêmes résultats, 0,5s sur mon PC: P
Alex
9
@Alex Pekka peut également signifier que l' écriture réelle des booléens minuscules est plus rapide. Cela a du sens, avoir à utiliser moins de clés. La différence est minime, cependant.
Martti Laine
Désolé, j'ai accidentellement voté contre après avoir voté pour vous.
SIFE
1
Une observation intéressante: var_export () écrit vrai et faux en minuscules, mais NULL en majuscules. Charmant, hein? 3v4l.org/6Oelk
donquixote

Réponses:

89

Le manuel PHP officiel dit:

Pour spécifier un littéral booléen, utilisez les mots-clés TRUE ou FALSE. Les deux sont insensibles à la casse.

Alors oui, true === TRUEet false === FALSE.

Personnellement, cependant, je préfère TRUEencore trueet FALSEencore falsepour des raisons de lisibilité. C'est la même raison pour ma préférence d'utiliser ORover oror ||, et ANDover andor &&.

Le PSR-2 norme exige true, falseet nulld'être en minuscules.

Lukman
la source
81
Je veux juste souligner que ORet ||sont des opérateurs différents en PHP (car ils ont une priorité différente), comme le sont ANDet &&. (Par exemple, &&et ||ont une priorité plus élevée que les opérateurs d'affectation, mais ORet ANDne le sont pas.)
Johrn
21
De plus, avec les IDE d'aujourd'hui, je ne vois pas la raison d'avoir des booléens en majuscules purs comme surligneur de syntaxe pour la plupart des IDE, séparez-les avec une grande distinction.
RobertPitt
37
Je préfère de loin les taper en minuscules pour ne pas avoir à maintenir la touche Maj enfoncée.
Ack
6
J'aime aussi les minuscules - comme en java, mais à chacun il y en a. Je souhaiterais cependant qu'ils s'installent dans un sens et nous fassent tous passer à l'un ou à l'autre !!!!! Ce n'est pas une flexibilité dont j'ai vraiment besoin!
Ray
5
@Cyril: Il y a beaucoup de bonnes raisons de se livrer à détester PHP (par exemple, voyez ce que Johrn a mentionné ci-dessus, je ne le savais pas), mais étant donné que c'est fondamentalement insensible à la casse, il n'y a rien d'étrange dans les cas mixtes les expressions étant les mêmes. Ce qui n'a pas de sens, cependant, c'est qu'il mélange la sensibilité à la casse et l'insensibilité à la casse avec une insensibilité générale. (Voir par exemple: stackoverflow.com/questions/5643496/… )
Sz.
110
define('TRUE', false);
define('FALSE', true);

Bon débogage! (PHP < 5.1.3 (2 mai 2006) , voir Démo )

Edit: les booléens majuscules sont des constantes et les minuscules sont des valeurs. Vous êtes intéressé par la valeur, pas par la constante, qui peut facilement changer.


Eliminated run-time constant fetching for TRUE, FALSE and NULL

author      dmitry <dmitry>
            Wed, 15 Mar 2006 09:04:48 +0000 (09:04 +0000)
committer   dmitry <dmitry>
            Wed, 15 Mar 2006 09:04:48 +0000 (09:04 +0000)
commit      d51599dfcd3282049c7a91809bb83f665af23b69
tree        05b23b2f97cf59422ff71cc6a093e174dbdecbd3
parent      a623645b6fd66c14f401bb2c9e4a302d767800fd

Commits d51599dfcd3282049c7a91809bb83f665af23b69 (et 6f76b17079a709415195a7c27607cd52d039d7c3 )

Radu
la source
7
-1 parce que A) c'est inutile. B) cela ne répond pas à la question. et C) J'ai déjà accepté la bonne réponse, et cela ne présente aucune information supplémentaire utile .
Austin Hyde
36
Alors laissez-moi vous expliquer en détail: les booléens majuscules sont des constantes et les minuscules sont des valeurs. Vous êtes intéressé par la valeur, pas par la constante, qui peut facilement changer. Donc, si vous aviez réfléchi un peu au texte et ne vous précipitiez pas pour donner une sanction, vous auriez probablement compris cela.
Radu
13
Je comprends le point que vous faites (maintenant), mais la façon dont vous l'avez fait à l'origine était (IMO) cryptique et inutile. Si vous aviez initialement modifié la réponse, j'aurais voté pour, car c'est un très bon point, en fait.
Austin Hyde
4
C'est la bonne réponse. J'aurais dû obtenir les points pour cela.
Serialworm
22
En ce qui concerne l'édition, cette description est un peu trompeur ... Les valeurs réelles (elles - mêmes qui se compilés vers le bas en jetons T_NULL, T_TRUEet T_FALSEau moment de l' analyse), sont insensibles à la casse, donc l' utilisation NULLn'est pas réellement une « constante » --- sauf si vous en faites une constante, en utilisant define(). Utiliser simplement NULLou TRUEne signifie pas que c'est une constante, comme s'il n'y avait pas de telle constante, PHP l'interprète comme le littéral. Une description plus précise est que les versions minuscules ne peuvent pas être redéfinies, alors que toute autre variante de cas peut .
Joe
31

Utilisez des minuscules.

  1. C'est plus facile à taper. (OMI)
  2. C'est plus facile à lire. (OMI)
  3. Les booléens JavaScript sont en minuscules et sensibles à la casse.
Bo Allen
la source
6
+1; J'étais juste sur le point d'ajouter l'argument Javascript: comme il est TRÈS courant dans la programmation Web d'écrire du code PHP et JS, les muscles des doigts bien développés pour le développement Web continuent à appliquer systématiquement la même casse que celle utilisée dans le dernier contexte de langage. Au moins, je me suis souvent retrouvé à écrire TRUE ou FALSE en Javascript après être passé de PHP. L'utilisation de minuscules en PHP a résolu celui-ci pour de bon.
Sz.
11

Si vous avez l'intention d'utiliser JSON, la RFC7159 dit:

Les noms littéraux DOIVENT être en minuscules. Aucun autre nom littéral n'est autorisé.

Dans la liste des modifications rétrocompatibles de PHP 5.6 :

json_decode () rejette désormais les variantes non minuscules des littéraux JSON true, false et null à tout moment, conformément à la spécification JSON

Selon la norme PSR-2 :

Les mots clés PHP DOIVENT être en minuscules.

Les constantes PHP true, false et null DOIVENT être en minuscules.

Mandragore
la source
Correct, mais cette question concernait spécifiquement les booléens majuscules / minuscules en PHP , pas JSON. Par exemple, les deux json_encode(TRUE)et le json_encode(true)rendement 'true'.
Austin Hyde
3
Désolé de mentionner JSON, serait-il préférable de supprimer toutes ces références et de mentionner uniquement PSR-2?
Mandrake
4
Je pense que la référence à JSON est appropriée, car vous utilisez fréquemment javascript / JSON avec PHP, et vous recherchez peut-être la cohérence.
Doug Kress
9

J'avais l'habitude de faire des booléens TRUE / FALSE de style C comme tous les consts, en majuscules, jusqu'à ce que je prenne le train en marche PSR .

Section 2.5 du PSR-2:

Les constantes PHP true, false et null DOIVENT être en minuscules.

Donc, fondamentalement, si vous voulez jouer gentiment avec des détails de style open source, les booléens doivent être en minuscules.

Todd
la source
5

Cela n'a pas d'importance, truec'est exactement la même chose TRUE. Il en va de même pour falseet null. Je n'ai jamais entendu dire que cela aurait eu de l'importance à aucun moment.

La seule façon de gâcher les choses est de citer ces valeurs, par exemple:

$foo = false;   // FALSE
$bar = "false"; // TRUE

$foo2 = true;   // TRUE
$bar2 = "true"; // TRUE

$foo3 = null;   // NULL
$bar3 = "null"; // TRUE

La seule chose qui vous restreint ou vous encourage à utiliser des majuscules ou des minuscules peut être votre entreprise ou vos propres directives de codage. En dehors de cela, vous êtes libre d'utiliser l'un ou l'autre et cela ne causera aucun problème.

Tatu Ulmanen
la source
FALSE et NULL ne sont pas identiques. is_null () ne renvoie pas vrai si la valeur === FALSE.
Noah Goodrich
9
@Noah Goodrich, je n'ai à aucun moment laissé entendre cela falseet ce nullserait pareil. J'ai dit que "il en va de même pour falseet null", ce qui signifie que les deux peuvent être exprimés en lettres minuscules ou majuscules.
Tatu Ulmanen
5

J'ai écrit du code simple pour vérifier les différences entre false et FALSE : chaque itération faisait quelque chose qui:

    for ($i = 0; $i < self::ITERATIONS; ++$i) {
       (0 == FALSE) ;
    }

Voici les résultats:

Iterations: 100000000
using 'FALSE': 25.427761077881 sec
using 'false': 25.01614689827 sec

On voit donc que les performances sont très légèrement touchées par le cas des booléens - les minuscules sont plus rapides. Mais vous ne verrez certainement pas.

Arkadij Kuzhel
la source
Quel moteur JS? De nos jours, JS est compilé en mémoire avant exécution.
Tiberiu-Ionuț Stan
1
PHP est tokenisé avant l'exécution, et il ne devrait y avoir aucune différence de temps. Une autre réponse a indiqué que la tige était plus rapide. Les différences de cette ampleur dans tout test doivent être ignorées - cette différence est de 2,5e-7 par itération.
Doug Kress
4

Personnellement, j'ai toujours utilisé la forme minuscule, mais pour aucune raison particulière autre que pour rendre mon code bien rangé, le seul endroit où j'utilise des lettres majuscules est quand les noms de classe de casse et les noms de variables de chameau.

Un avantage de l'utilisation des majuscules qui me vient à l'esprit est qu'elles ressortent et sont faciles à trouver dans le code.

RMcLeod
la source
2
+1 pour la propreté. La tradition en majuscules vient de C, mais il est grand temps que nous nous débarrassions de cette forme laide.
Petruza
2

Je suis tombé sur cette vieille question en me posant la même chose. Bon point avec define ('TRUE', false); define ('FALSE', true); Ne s'applique pas à php5 cependant. Ecrire ces lignes dans un code php5 revient à écrire un commentaire.

Conrad
la source
6
Juste pour référence future, vous avez posté ceci comme "réponse". Sur StackOverflow, contrairement aux forums traditionnels, les messages conversationnels qui ne servent pas réellement de solution à la question et ne fournissent pas d'informations utiles doivent être publiés en tant que commentaire sur la question d'origine ou la réponse pertinente. Dans ce cas, votre message conviendrait mieux à un commentaire sur ma question qu'à une réponse.
Austin Hyde
8
en fait, il est utile de savoir que cela ne fonctionne plus en PHP 5: P
Alex
1

Voici mon TEST sur Windows 7x64bit Apache / 2.4.9 PHP / 5.5.14

$blockLimit = 50;
while($blockLimit > 0): $blockLimit--;

//STAR Here ================================================

$msc = microtime(true);
for ($i = 0; $i < 100000; $i++) {
   echo (FALSE);
}
echo 'FALSE took ' . number_format(microtime(true)-$msc,4) . " Seconds\r\n";
$msc = microtime(true);
for ($i = 0; $i < 100000; $i++) {
   echo (false);
}
echo 'false took ' . number_format(microtime(true)-$msc,4) . " Seconds\r\n";

echo "\r\n --- \r\n";
//Shutdown ==================================================
endwhile;

Cette fois, FALSE a gagné 20 fois. Donc, les majuscules sont plus rapides dans mon environnement.

Abbas Uddin
la source