Booleane maiuscole contro minuscole in PHP


135

Quando stavo imparando PHP, ho letto da qualche parte che dovresti sempre usare le versioni maiuscole dei booleani TRUEe FALSE, poiché le "normali" versioni minuscole truee false, non erano "sicure" da usare.

Ormai sono passati molti anni e ogni script PHP che ho scritto utilizza la versione maiuscola. Ora, però, lo sto mettendo in dubbio, visto che ho visto molti PHP scritti con la versione minuscola (ovvero Zend Framework).

C'è / c'è mai stato un motivo per usare la versione maiuscola o è perfettamente OK usare la minuscola?

modifica: ho dimenticato di dire che questo vale anche per NULLe null.


4
Esistono numerosi siti che affermano che scrivere in minuscolo è presumibilmente "molto più veloce", ma senza citare alcuna fonte seria. Interessato a vedere se succede qualcosa.
Pekka,

2
Non è vero. L'ho provato con iterazioni 5M ed entrambi hanno dato gli stessi risultati, 0,5 secondi sul mio PC: P
Alex

9
@Alex Pekka può anche significare che la scrittura effettiva di caratteri booleani minuscoli è più veloce. Questo ha senso, dover usare meno chiavi. La differenza è piccola, però.
Martti Laine,

Scusa, ho votato per errore dopo aver votato per te.
SIFE,

1
Un'osservazione interessante: var_export () scrive vero e falso come minuscolo, ma NULL come maiuscolo. Adorabile, eh? 3v4l.org/6Oelk
donquixote il

Risposte:


89

Il manuale ufficiale di PHP dice:

Per specificare un valore letterale booleano, utilizzare le parole chiave TRUE o FALSE. Entrambi non fanno distinzione tra maiuscole e minuscole.

Quindi sì, true === TRUEe false === FALSE.

Personalmente, tuttavia, preferisco TRUEpiù truee FALSEpiù volte falseper motivi di leggibilità. È lo stesso motivo per cui preferisco usare ORover oro ||e ANDover over ando &&.

La PSR-2 standard richiede true, falsee nulldi essere in minuscolo.


81
Voglio solo sottolineare che ORe ||sono diversi operatori in PHP (come in hanno una diversa precedenza), come lo sono ANDe &&. (Così, per esempio &&e ||sono precedenza maggiore rispetto agli operatori di assegnazione, ma ORe ANDnon lo sono.)
Johrn

21
Inoltre, con gli IDE di oggi non vedo il motivo per avere un booleano maiuscolo puro come Evidenziatore di sintassi per la maggior parte degli IDE li separa con grande distinzione.
RobertPitt,

37
Preferisco di gran lunga digitarli in minuscolo, quindi non devo tenere premuto il tasto Maiusc.
ack

6
Mi piacciono anche le lettere minuscole - come in Java, ma a ognuna ce n'è una. Vorrei comunque che si accontentassero di UN modo e ci facessero cambiare tutti l'uno o l'altro !!!!! Questa non è una flessibilità che ho davvero bisogno di avere!
Ray,

5
@Cyril: Ci sono molte buone ragioni per indulgere nell'odiare PHP (ad esempio, vedi quello che Johrn ha menzionato sopra, non lo sapevo per uno), ma dato che è fondamentalmente insensibile alle maiuscole / minuscole, non c'è nulla di strano nel caso misto le espressioni sono le stesse. Ciò che è assurdo, tuttavia, che mescola la distinzione tra maiuscole e minuscole e insensibilità ai casi con insensibilità generale. (Vedi ad esempio: stackoverflow.com/questions/5643496/… )
Sz.

110
define('TRUE', false);
define('FALSE', true);

Buon debug! (PHP < 5.1.3 (2 maggio 2006) , vedi Demo )

Modifica: i bool maiuscoli sono costanti e le minuscole sono valori. Sei interessato al valore, non alla costante, che può facilmente cambiare.


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

Commit d51599dfcd3282049c7a91809bb83f665af23b69 (e 6f76b17079a709415195a7c27607cd52d039d7c3 )


7
-1 perché A) questo è inutile. B) questo non risponde alla domanda. e C) ho già accettato la risposta corretta e questo non presenta ulteriori informazioni utili .
Austin Hyde,

36
Quindi lasciami spiegare in dettaglio: i bool maiuscoli sono costanti e le minuscole sono valori. Sei interessato al valore, non alla costante, che può facilmente cambiare. Quindi, se avessi pensato un po 'al testo e non avessi fretta di dare una penalità, probabilmente l'avresti capito.
Radu,

13
Capisco il punto che stai sollevando (ora), ma il modo in cui l'hai fatto inizialmente era (IMO) enigmatico e inutile. Se in origine avessi appena apportato la tua modifica alla risposta, avrei votato, dato che questo è un ottimo punto, in realtà.
Austin Hyde,

4
Questa è la risposta esatta. Avrei dovuto ottenere i punti per questo.
serialworm,

22
Per quanto riguarda la modifica, che la descrizione è un po 'fuorviante ... I valori veri e propri (che vengono compilati in giù in token T_NULL, T_TRUEe T_FALSEin fase di analisi), sono case-insensitive, in modo da utilizzare NULLnon è in realtà una "costante" --- a meno che tu non lo trasformi in una costante, usando define(). Semplicemente usando NULLo TRUEnon significa che è una costante, come se non ci fosse tale costante, PHP la interpreta come letterale. Una descrizione più accurata è che le versioni minuscole non possono essere ridefinite, mentre qualsiasi altra variazione del caso può .
Joe,

31

Usa lettere minuscole.

  1. È più facile da scrivere. (IMO)
  2. È più facile da leggere. (IMO)
  3. I booleani JavaScript sono minuscoli e sensibili al maiuscolo / minuscolo.

6
+1; Stavo solo per aggiungere l'argomento Javascript: poiché è MOLTO comune nella programmazione web scrivere codice PHP e JS, i muscoli delle dita ben sviluppati per lo sviluppo web continuano ad applicare regolarmente lo stesso caso di lettere usato nell'ultimo contesto linguistico. Almeno mi sono ritrovato spesso a scrivere TRUE o FALSE in Javascript dopo essere passato da PHP. L'uso di lettere minuscole in PHP ha risolto questo problema per sempre.
Sz.

11

Se si intende utilizzare JSON, RFC7159 dice:

I nomi letterali DEVONO essere minuscoli. Non sono ammessi altri nomi letterali.

Dall'elenco delle modifiche incompatibili all'indietro in PHP 5.6 :

json_decode () ora rifiuta in ogni momento varianti non minuscole dei letterali JSON true, false e null, secondo la specifica JSON

Secondo lo standard PSR-2 :

Le parole chiave PHP DEVONO essere in minuscolo.

Le costanti PHP true, false e null DEVONO essere in minuscolo.


Corretto, ma questa domanda riguardava specificamente i booleani maiuscoli / minuscoli in PHP , non JSON. Ad esempio, entrambi json_encode(TRUE)e json_encode(true)rendimento 'true'.
Austin Hyde,

3
Ci scusiamo per aver menzionato JSON, sarebbe meglio se rimuovessi tutti quei riferimenti e menzionassi solo PSR-2?
Mandrake,

4
Penso che il riferimento a JSON sia appropriato, poiché usi spesso javascript / JSON con PHP e potresti cercare coerenza.
Doug Kress,

9

Ero solito fare booleani in stile C VERO / FALSO come tutti i contro, in ogni maiuscolo, fino a quando non salivo sul carrozzone PSR .

Sezione 2.5 di PSR-2:

Le costanti PHP true, false e null DEVONO essere in minuscolo.

Quindi, in sostanza, se vuoi giocare bene con particolari in stile open source, i booleani devono essere minuscoli.


5

Non importa, trueè esattamente lo stesso di TRUE. Lo stesso vale per falsee null. Non ho sentito che avrebbe avuto importanza in qualsiasi momento.

L'unico modo in cui puoi rovinare le cose è citando quei valori, ad esempio:

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

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

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

L'unica cosa che ti limita o ti incoraggia a usare lettere maiuscole o minuscole potrebbe essere la tua azienda o le tue linee guida di codifica. A parte questo, sei libero di usare uno dei due e non ci saranno problemi.


FALSE e NULL non sono gli stessi. is_null () non restituisce true se il valore === FALSE.
Noah Goodrich,

9
@ Noah Goodrich, non ho mai sottinteso questo falsee nullsarebbe lo stesso. Ho detto che "stesso vale per falsee null", il che significa che entrambi possano essere espressi in lettere minuscole o maiuscole.
Tatu Ulmanen,

5

Ho scritto un semplice codice per verificare le differenze tra false e FALSE : ogni iterazione stava facendo qualcosa che:

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

Ecco i risultati:

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

Quindi possiamo vedere che le prestazioni sono leggermente toccate dal caso booleano: le lettere minuscole sono più veloci. Ma sicuramente non lo vedrai.


Quale motore JS? Oggi JS viene compilato in memoria prima dell'esecuzione.
Tiberiu-Ionuț Stan,

1
PHP viene tokenizzato prima dell'esecuzione e non dovrebbe esserci alcuna differenza nel tempo. Un'altra risposta indicava che la tomaia era più veloce. Le differenze di questa grandezza in qualsiasi test devono essere ignorate: questa differenza è 2,5e-7 per iterazione.
Doug Kress,

4

Personalmente ho sempre usato la forma minuscola, ma per nessun motivo particolare se non quello di rendere ordinato il mio codice, l'unico posto in cui uso le lettere maiuscole è quando si usano i nomi delle classi e i nomi delle variabili.

Uno dei vantaggi dell'uso delle maiuscole che viene in mente è che si distinguono e sono facili da trovare nel codice.


2
+1 per l'ordine. Tutta la tradizione dei tappi viene dalla C, ma è ora che ci liberiamo di quella brutta forma.
Petruza,

2

Mi sono imbattuto in questa vecchia domanda mentre mi ponevo la stessa cosa. Buon punto con define ('TRUE', false); define ('FALSE', true); Tuttavia, non si applica a php5. Scrivere quelle righe in un codice php5 è come scrivere un commento.


6
Solo per riferimento futuro, hai pubblicato questo come "risposta". Su StackOverflow, a differenza dei forum tradizionali, i post conversazionali che in realtà non servono come soluzione alla domanda e che non forniscono informazioni utili dovrebbero essere pubblicati come commenti alla domanda originale o alla risposta pertinente. In questo caso, il tuo post sarebbe più adatto a un commento sulla mia domanda che a una risposta.
Austin Hyde,

8
in realtà è utile sapere che non funziona più in PHP 5: P
Alex,

1

Ecco il mio TEST su 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;

Questa volta FALSO ha vinto 20 volte. Quindi il maiuscolo è più veloce nel mio ambiente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.