Wielkie litery booleans a małe litery w PHP

137

Kiedy uczyłem się PHP, przeczytałem gdzieś, że zawsze powinieneś używać wersji logicznych z dużymi literami TRUEi FALSE, ponieważ "normalne" wersje pisane małymi literami truei falsenie były "bezpieczne" w użyciu.

Minęło już wiele lat i każdy napisany przeze mnie skrypt PHP używa wersji pisanej wielkimi literami. Teraz jednak kwestionuję to, ponieważ widziałem wiele PHP napisanych małymi literami (tj. Zend Framework).

Czy / czy istniał kiedykolwiek powód, aby używać wersji z dużymi literami, czy też jest całkowicie OK, aby używać małych liter?

EDIT: Zapomniałem wspomnieć, że dotyczy to NULLi nulltak dobrze.

Austin Hyde
źródło
4
Istnieje wiele witryn, które twierdzą, że pisanie małych liter jest rzekomo „znacznie szybsze”, ale bez powoływania się na żadne poważne źródła. Ciekawe, czy coś się wydarzy.
Pekka,
2
To nieprawda. Przetestowałem to z iteracjami 5M i oba dały te same wyniki, 0,5 s na moim komputerze: P
Alex
9
@Alex Pekka może również oznaczać, że faktyczne pisanie małych liter logicznych jest szybsze. Ma to sens, ponieważ trzeba używać mniejszej liczby kluczy. Jednak różnica jest niewielka.
Martti Laine
Przepraszam, przypadkowo zagłosowałem na odrzucenie po tym, jak zagłosowałem na Ciebie.
SIFE
1
Interesująca obserwacja: var_export () zapisuje prawdę i fałsz jako małe litery, ale NULL jako wielkie. Cudownie, co? 3v4l.org/6Oelk
donquixote

Odpowiedzi:

91

Oficjalny podręcznik PHP mówi:

Aby określić literał logiczny, użyj słów kluczowych TRUE lub FALSE. W obu przypadkach wielkość liter nie jest rozróżniana.

Więc tak, true === TRUEi false === FALSE.

Osobiście jednak wolę TRUEnad truei FALSEnad falsewzględów czytelności. To ten sam powód, dla którego preferuję używanie ORover oror ||i ANDover andor &&.

PSR-2 standard wymaga true, falsei nullbyć pisane małymi literami.

Lukman
źródło
83
Chcę tylko zauważyć, że ORi ||są to różne operatory w PHP (ponieważ mają różne pierwszeństwo), podobnie jak ANDi &&. (Na przykład &&i ||mają wyższy priorytet niż operatory przypisania, ale ORi ANDnie są).
Johrn
22
Również w przypadku dzisiejszych IDE nie widzę powodu, aby używać czystych wielkich liter jako wartości logicznych jako wyróżnienia składni dla większości IDE, oddzielając je z wielkim rozróżnieniem.
RobertPitt
37
O wiele wolę pisać je małymi literami, więc nie muszę przytrzymywać klawisza Shift.
potwierdzenie z
6
Lubię też małe litery - jak w javie, ale do każdego tam własne. Chciałbym jednak, żeby zdecydowali się na JEDEN sposób i po prostu zmusili nas wszystkich do zmiany na jedną lub drugą !!!!! To nie jest elastyczność, której naprawdę potrzebuję!
Ray
5
@Cyril: Jest wiele dobrych powodów, aby pozwolić sobie na nienawiść do PHP (np. Po prostu zobacz, o czym wspomniał Johrn powyżej, nie wiedziałem o tym), ale biorąc pod uwagę, że w zasadzie nie ma rozróżniania wielkości liter, nie ma nic dziwnego w przypadku mieszanych wielkości liter wyrażenia są takie same. Co jest jednak nonsensem, że łączy w sobie rozróżnianie wielkości liter i niewrażliwość na wielkość liter z ogólną niewrażliwością. (Patrz np .: stackoverflow.com/questions/5643496/… )
Sz.
111
define('TRUE', false);
define('FALSE', true);

Miłego debugowania! (PHP < 5.1.3 (2 maja 2006) , zobacz Demo )

Edycja: wielkie litery to stałe, a małe litery to wartości. Interesuje Cię wartość, a nie stała, która może się łatwo zmienić.


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

Zatwierdza d51599dfcd3282049c7a91809bb83f665af23b69 (i 6f76b17079a709415195a7c27607cd52d039d7c3 )

Radu
źródło
7
-1, ponieważ A) jest to bezcelowe. B) to nie odpowiada na pytanie. oraz C) Już zaakceptowałem poprawną odpowiedź i nie przedstawia to żadnych dodatkowych pomocnych informacji.
Austin Hyde
36
Pozwólcie, że wyjaśnię szczegółowo: wielkie litery to stałe, a małe litery to wartości. Interesuje Cię wartość, a nie stała, która może się łatwo zmienić. Tak więc, gdybyś pomyślał trochę nad tekstem i nie spieszył się z wymierzeniem kary, prawdopodobnie byś to zrozumiał.
Radu
13
Rozumiem, o czym mówisz (teraz), ale sposób, w jaki to przedstawiłeś, był (IMO) tajemniczy i bezcelowy. Gdybyś pierwotnie wprowadził swoją edycję odpowiedzi, zagłosowałbym za, ponieważ jest to właściwie bardzo dobra uwaga.
Austin Hyde
4
To jest właściwa odpowiedź. Powinienem zdobyć za to punkty.
serialworm
24
Co do edycji, że opis jest nieco mylący ... Rzeczywiste same wartości (które się skompilowane w dół na tokeny T_NULL, T_TRUEi T_FALSEna parse czasu), są wielkości liter, więc użycie NULLnie jest rzeczywiście „stałą” --- chyba że uczynisz to stałą, używając define(). Po prostu użycie NULLlub TRUEnie oznacza, że ​​jest to stała, tak jakby nie było takiej stałej, PHP interpretuje ją jako literał. Bardziej dokładny opis jest, że wersje te małe nie może być na nowo, natomiast wszelkich innych zmian przypadek puszki .
Joe
31

Użyj małych liter.

  1. Łatwiej jest pisać. (IMO)
  2. Łatwiej się czyta. (IMO)
  3. Wartości logiczne JavaScript uwzględniają małe i duże litery.
Bo Allen
źródło
7
+1; Chciałem tylko dodać argument Javascript: ponieważ w programowaniu internetowym BARDZO powszechne jest pisanie zarówno kodu PHP, jak i JS, dobrze rozwinięte mięśnie palców przy programowaniu stron internetowych nadal rutynowo stosują tę samą wielkość liter, co w ostatnim kontekście językowym. Przynajmniej często zdarzało mi się pisać TRUE lub FALSE w Javascript po przejściu z PHP. Używanie małych liter w PHP naprawiło to na dobre.
Sz.
11

Jeśli zamierzasz używać JSON, to RFC7159 mówi:

Nazwy literałów MUSZĄ składać się z małych liter. Żadne inne nazwy literalne nie są dozwolone.

Z listy niekompatybilnych wstecz zmian w PHP 5.6 :

json_decode () teraz odrzuca warianty literałów JSON, które nie są małymi literami, przez cały czas, prawda, fałsz i null, zgodnie ze specyfikacją JSON

Zgodnie ze standardem PSR-2 :

Słowa kluczowe PHP MUSZĄ być pisane małymi literami.

Stałe PHP true, false i null MUSZĄ być zapisane małymi literami.

Mandragora
źródło
Prawidłowo, ale to pytanie dotyczyło w szczególności wartości logicznych z dużych / małych liter w PHP , a nie JSON. Na przykład zarówno, jak json_encode(TRUE)i json_encode(true)wydajność 'true'.
Austin Hyde,
3
Przepraszam, że wspominam o JSON, czy byłoby lepiej, gdybym usunął wszystkie te odniesienia i wspomniał tylko o PSR-2?
Mandrake
4
Myślę, że odniesienie do JSON jest odpowiednie, ponieważ często używasz javascript / JSON z PHP i możesz szukać spójności.
Doug Kress
9

Kiedyś wykonywałem wartości logiczne TRUE / FALSE w stylu C, takie jak wszystkie const, we wszystkich kapslach, dopóki nie dostałem się na modę PSR .

Sekcja 2.5 PSR-2:

Stałe PHP true, false i null MUSZĄ być zapisane małymi literami.

Zasadniczo, jeśli chcesz dobrze bawić się szczegółami stylu open source, Booleans musi być małymi literami.

Todd
źródło
5

To nie ma znaczenia, truejest dokładnie takie samo jak TRUE. To samo dotyczy falsei null. Nie słyszałem, żeby to miało jakiekolwiek znaczenie.

Jedynym sposobem na zepsucie jest cytowanie tych wartości, na przykład:

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

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

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

Jedyną rzeczą ograniczającą lub zachęcającą do używania wielkich lub małych liter mogą być wytyczne firmy lub własne wytyczne dotyczące kodowania. Poza tym możesz używać jednego z nich i nie spowoduje to żadnych problemów.

Tatu Ulmanen
źródło
FALSE i NULL to nie to samo. is_null () nie zwraca true, jeśli wartość === FALSE.
Noah Goodrich
9
@Noah Goodrich, w żadnym momencie tego nie sugerowałem falsei nullbędzie tak samo. Powiedziałem, że „to samo dotyczy falsei null”, co oznaczało, że oba można wyrazić małymi lub dużymi literami.
Tatu Ulmanen
5

Napisałem prosty kod, aby sprawdzić różnice między fałszem a FAŁSZEM : Każda iteracja powodowała:

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

Oto wyniki:

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

Widzimy więc, że wielkość liter logicznych bardzo nieznacznie wpływa na wydajność - małe litery są szybsze. Ale na pewno nie zobaczysz.

Arkadij Kuzhel
źródło
Jaki silnik JS? Obecnie JS jest kompilowany w pamięci przed wykonaniem.
Tiberiu-Ionuț Stan
1
PHP jest tokenizowane przed wykonaniem i nie powinno być żadnej różnicy w czasie. Inna odpowiedź wskazywała, że ​​cholewka była szybsza. Różnice tej wielkości w każdym teście należy zignorować - ta różnica wynosi 2,5e-7 na iterację.
Doug Kress
4

Osobiście zawsze używałem małych liter, ale bez szczególnego powodu, poza tym, aby mój kod wyglądał schludnie, jedynym miejscem, w którym używam wielkich liter, są nazwy klas i nazwy zmiennych wielbłądów.

Jedną z zalet używania wielkich liter, która przychodzi na myśl, jest to, że odstają i są łatwe do znalezienia w kodzie.

RMcLeod
źródło
2
+1 za porządek. Cała tradycja czapek wywodzi się z C, ale najwyższy czas pozbyć się tej brzydkiej formy.
Petruza,
2

Natknąłem się na to stare pytanie, zadając sobie to samo. Słuszna uwaga z definicją („TRUE”, false); define („FALSE”, true); Nie dotyczy to jednak php5. Pisanie tych linii w kodzie php5 jest jak pisanie komentarza.

Conrad
źródło
6
Tylko do przyszłego użytku, opublikowałeś to jako „odpowiedź”. W StackOverflow, w przeciwieństwie do tradycyjnych forów, posty konwersacyjne, które w rzeczywistości nie służą jako odpowiedź na pytanie i nie zawierają przydatnych informacji, powinny być publikowane jako komentarz do oryginalnego pytania lub odpowiedniej odpowiedzi. W takim przypadku Twój post lepiej pasowałby do komentarza do mojego pytania niż odpowiedzi.
Austin Hyde,
8
właściwie dobrze jest wiedzieć, że to już nie działa w PHP 5: P
Alex
1

Oto mój TEST na 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;

Tym razem FALSE wygrał 20 razy. Więc wielkie litery są szybsze w moim środowisku.

Abbas Uddin
źródło
0

Spóźniłem się na imprezę od lat, ale chciałem wspomnieć o czymś interesującym, o czym jeszcze nie ma w wątku. Dziś odkryłem, że Truejest również ważny, a nie tylko truelub TRUE. Wszystkie pisownie są równoważne. Jest to istotne z powodu generatora Open API dla PHP, którego używa True. (Co doprowadziło mnie do oszołomienia i poszukiwań, które znalazły tę stronę).

Jan
źródło