Booleanos Maiúsculos vs. Minúsculos no PHP


135

Quando eu estava aprendendo PHP, li em algum lugar que você sempre deve usar as versões em maiúsculas dos booleanos TRUEe FALSE, porque as versões em letras minúsculas "normais" truee falsenão eram "seguras" de usar.

Agora já faz muitos anos, e todo script PHP que escrevi usa a versão em maiúsculas. Agora, porém, estou questionando isso, pois vi bastante PHP escrito com a versão em minúscula (ou seja, Zend Framework).

Existe / houve algum motivo para usar a versão em maiúsculas ou é perfeitamente aceitável usar a minúscula?

edit: esqueci de mencionar que isso se aplica a NULLe nullbem.


4
Existem vários sites dizendo que escrever em letras minúsculas é supostamente "muito mais rápido", mas sem citar fontes sérias. Interessado em ver se algo acontece.
Pekka

2
Isso não é verdade. Eu testei com iterações 5M e ambos deram os mesmos resultados, 0,5s no meu PC: P
Alex

9
@Alex Pekka também pode significar que a escrita real de booleanos em minúsculas é mais rápida. Isso faz sentido, ter que usar menos chaves. A diferença é pequena, no entanto.
Martti Laine

Desculpe, acidentalmente votei contra depois de votar em você.
SIFE

1
Uma observação interessante: var_export () escreve true e false como minúsculas, mas NULL como maiúsculas. Adorável, eh? 3v4l.org/6Oelk
Donquixote

Respostas:


89

O manual oficial do PHP diz:

Para especificar um literal booleano, use as palavras-chave TRUE ou FALSE. Ambos não diferenciam maiúsculas de minúsculas.

Então sim, true === TRUEe false === FALSE.

Pessoalmente, porém, eu prefiro TRUEmais truee FALSEmais falsepor razões de legibilidade. É o mesmo motivo da minha preferência em usar ORover orou ||, e usar ANDover andou &&.

O PSR-2 padrão requer true, falsee nullpara estar em minúsculas.


81
Só quero salientar que ORe ||são operadores diferentes no PHP (como eles têm precedência diferente), como são ANDe &&. (Assim, por exemplo &&e ||é maior precedência do que os operadores de atribuição, mas ORe ANDnão são.)
Johrn

21
Também no IDE de hoje, não vejo o motivo de ter um valor booleano em maiúsculas puro, pois o Syntax Highlighter da maioria dos IDE os separa com grande distinção.
precisa saber é o seguinte

37
Eu prefiro digitá-las em letras minúsculas para não ter que pressionar a tecla Shift.
Ack

6
Eu também gosto de letras minúsculas - como em java, mas cada uma delas possui. Eu gostaria, no entanto, que eles se instalassem em um caminho e apenas nos fizessem mudar para um ou outro !!!!! Esta não é uma flexibilidade que eu realmente preciso ter!
21412 Ray

5
@Cyril: Existem muitas boas razões para se odiar o PHP (por exemplo, veja o que Johrn mencionou acima, eu não sabia disso), mas, como é basicamente insensível a maiúsculas e minúsculas, não há nada estranho em maiúsculas e minúsculas. expressões sendo iguais. O que não faz sentido, no entanto, é que ele mistura sensibilidade e insensibilidade a maiúsculas e minúsculas com insensibilidade geral. (Veja, por exemplo: stackoverflow.com/questions/5643496/… )
Sz.

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

Feliz depuração! (PHP < 5.1.3 (2 de maio de 2006) , consulte Demo )

Edit: Bools maiúsculos são constantes e minúsculas são valores. Você está interessado no valor, não na constante, que pode mudar facilmente.


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

Confirma d51599dfcd3282049c7a91809bb83f665af23b69 (e 6f76b17079a709415195a7c27607cd52d039d7c3 )


7
-1 porque A) isso não faz sentido. B) isso não responde à pergunta. e C) já aceitei a resposta correta e isso não apresenta nenhuma informação útil adicional .
Austin Hyde

36
Então deixe-me explicar em detalhes: bools maiúsculos são constantes e minúsculas são valores. Você está interessado no valor, não na constante, que pode mudar facilmente. Portanto, se você pensasse um pouco no texto e não se apressasse em aplicar uma penalidade, provavelmente entenderia isso.
Radu

13
Entendo o que você está argumentando (agora), mas a maneira como você fez isso originalmente foi (IMO) enigmática e sem sentido. Se você tivesse feito sua edição originalmente como resposta, eu teria votado, já que esse é um ponto muito bom.
Austin Hyde

4
Esta é a resposta certa. Deveria ter conseguido os pontos para isso.
serialworm

22
Quanto ao editar essa descrição é um pouco enganador ... Os próprios valores reais (que se compilados para baixo em tokens T_NULL, T_TRUEe T_FALSEno momento da análise), são insensíveis ao caso, portanto, usando NULLnão é realmente uma "constante" --- a menos que você faça uma constante, usando define(). Simplesmente usar NULLou TRUEnão significa que seja uma constante, como se não houvesse essa constante, o PHP a interpreta como literal. Uma descrição mais precisa é que as versões em minúsculas não podem ser redefinidas, enquanto qualquer outra variação de caso pode .
31412 Joe

31

Use minúsculas.

  1. É mais fácil digitar. (IMO)
  2. É mais fácil de ler. (IMO)
  3. Booleanos JavaScript são minúsculos e diferenciam maiúsculas de minúsculas.

6
+1; Eu estava apenas adicionando o argumento Javascript: como é MUITO comum na programação da Web escrever código PHP e JS, os músculos dos dedos do desenvolvimento da Web bem desenvolvidos continuam a aplicar rotineiramente a mesma letra usada no contexto da última linguagem. Pelo menos, muitas vezes me vi escrevendo VERDADEIRO ou FALSO em Javascript depois de mudar do PHP. O uso de letras minúsculas no PHP corrigiu este para sempre.
Sz.

11

Se você pretende usar JSON, então o RFC7159 diz:

Os nomes literais devem estar em minúsculas. Nenhum outro nome literal é permitido.

Na lista de mudanças incompatíveis com versões anteriores no PHP 5.6 :

json_decode () agora rejeita variantes não minúsculas dos literais JSON true, false e null em todos os momentos, conforme a especificação JSON

De acordo com o padrão PSR-2 :

Palavras-chave PHP devem estar em minúsculas.

As constantes PHP true, false e null DEVEM estar em minúsculas.


Correto, mas essa pergunta foi especificamente em relação aos booleanos maiúsculos / minúsculos no PHP , não no JSON. Por exemplo, ambos json_encode(TRUE)e json_encode(true)rendimento 'true'.
Austin Hyde

3
Desculpe por mencionar o JSON, seria melhor se eu removesse todas essas referências e apenas mencionasse o PSR-2?
Mandrake

4
Eu acho que a referência ao JSON é apropriada, pois você costuma usar javascript / JSON com PHP e pode estar procurando consistência.
Doug Kress

9

Eu costumava fazer booleanos no estilo C, VERDADEIRO / FALSO, como todos os consts, em todas as maiúsculas, até chegar ao movimento PSR .

Seção 2.5 do PSR-2:

As constantes PHP true, false e null DEVEM estar em minúsculas.

Então, basicamente, se você quiser se divertir com detalhes do estilo de código aberto, os booleanos devem ser minúsculos.


5

Não importa, trueé exatamente o mesmo que TRUE. O mesmo vale para falsee null. Não ouvi dizer que isso teria importância a qualquer momento.

A única maneira de você estragar tudo é citando esses valores, por exemplo:

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

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

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

A única coisa que restringe ou encoraja você a usar letras maiúsculas ou minúsculas pode ser a sua empresa ou suas próprias diretrizes de codificação. Fora isso, você pode usar qualquer um deles e isso não causará problemas.


FALSE e NULL não são os mesmos. is_null () não retornará true se o valor === FALSE.
Noah Goodrich

9
@ Noah Goodrich, em nenhum momento insinuei isso falsee nullseria o mesmo. Eu disse que "o mesmo vale falsee null", o que significa que ambos podem ser expressos em letras maiúsculas ou minúsculas.
Tatu Ulmanen

5

Eu escrevi um código simples para verificar as diferenças entre false e FALSE : Cada iteração estava fazendo algo que:

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

Aqui estão os resultados:

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

Portanto, podemos ver que o desempenho é levemente afetado pelo caso dos booleanos - as minúsculas são mais rápidas. Mas certamente você não verá.


Qual mecanismo JS? Atualmente, o JS é compilado na memória antes da execução.
Tiberiu-Ionuț Stan

1
O PHP é tokenizado antes da execução e não deve haver diferença no tempo. Outra resposta indicou que a parte superior foi mais rápida. Diferenças dessa magnitude em qualquer teste devem ser ignoradas - essa diferença é de 2,5e-7 por iteração.
Doug Kress

4

Pessoalmente, sempre usei o formulário em minúsculas, mas por nenhuma razão específica a não ser para deixar meu código organizado, o único lugar em que uso letras maiúsculas é quando os nomes de classes e nomes de variáveis ​​estão em maiúsculas e minúsculas.

Uma vantagem de usar letras maiúsculas que vem à mente é que elas se destacam e são fáceis de encontrar no código.


2
+1 para arrumar. Toda tradição de maiúsculas vem de C, mas já é hora de nos livrarmos dessa forma feia.
Petruza 30/08/12

2

Me deparei com essa pergunta antiga enquanto me perguntava a mesma coisa. Bom ponto com define ('TRUE', false); define ('FALSE', true); Não se aplica ao php5. Escrever essas linhas em um código php5 é como escrever um comentário.


6
Apenas para referência futura, você postou isso como uma "resposta". No StackOverflow, diferentemente dos fóruns tradicionais, as postagens de conversação que não servem realmente como solução para a pergunta e não fornecem informações úteis devem ser postadas como um comentário na pergunta original ou na resposta relevante. Nesse caso, sua postagem seria mais adequada para um comentário na minha pergunta do que para uma resposta.
Austin Hyde

8
na verdade, é útil saber que isso não funciona mais no PHP 5: P
Alex

1

Aqui está o meu teste no 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;

Desta vez, FALSE venceu 20 vezes. Então, maiúsculas é mais rápido no meu ambiente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.