Великі булеві та малі букви в PHP


135

Коли я вивчав PHP, я десь прочитав, що ви завжди повинні використовувати версії великих булів булів, TRUEі FALSE, оскільки "звичайні" малі версії, trueі falseне були "безпечними" для використання.

Зараз минуло багато років, і кожен написаний сценарій PHP використовує велику версію. Тепер, проте, я сумніваюся, що, оскільки я бачив багато PHP, написане з малої версії (тобто Zend Framework).

Чи / Було коли-небудь причина використовувати верхні регістри, або цілком нормально використовувати малі регістри?

редагувати: Забув згадати, що це стосується NULLі цього null, і іншого


4
Існує ряд сайтів, які стверджують, що написання цього малого регістру нібито "набагато швидше", але без посилань на будь-які серйозні джерела. Зацікавлено, чи щось з’являється.
Пекка

2
Це не правда. Я перевірив його за допомогою 5-ти ітерацій, і вони дали однакові результати, 0,5 на моєму ПК: P
Алекс,

9
@ Алекс Пекка також може означати, що власне написання малих булевих файлів відбувається швидше. Це має сенс, потрібно використовувати менше клавіш. Однак різниця невелика.
Martti Laine

Вибачте, я випадково проголосував після того, як я проголосував за вас.
SIFE

1
Цікаве зауваження: var_export () пише true та false як малі, а NULL як великі регістри. Прекрасно, так? 3v4l.org/6Oelk
donquixote

Відповіді:


89

В офіційному посібнику PHP написано:

Щоб вказати булевий літерал, використовуйте ключові слова TRUE або FALSE. Обидва нечутливі до регістру.

Так що так true === TRUEі false === FALSE.

Особисто, однак, я віддаю перевагу TRUEзнову trueі FALSEзнову falseз міркувань зрозумілості. Це та сама причина моїх переваг щодо використання ORнад orабо ||, і над використанням ANDнад andабо &&.

PSR-2 стандарт вимагає true, falseі nullбути в нижньому регістрі.


81
Просто хочу зазначити, що ORі ||є різні оператори в PHP (як і вони мають різний пріоритет), як є ANDі &&. (Так, наприклад , &&і ||вище , ніж пріоритет операторів присвоювання, але ORі ANDне є.)
Johrn

21
Також із сьогоднішніми IDE я не бачу причини мати чистий верхній регістр як буквений синтаксис для більшості IDE, відокремлюючи їх з великою відмінністю.
РобертПітт

37
Я дуже вважаю за краще вводити їх малими літерами, тому мені не потрібно утримувати клавішу зсуву.
ack

6
Мені подобається і нижній регістр - як у java, але у кожного є свій. Я хотів би, однак, вони оселилися б на ОДИН спосіб і просто змусили нас усіх перейти на те чи інше !!!!! Це не гнучкість, яку мені справді потрібно мати!
Рей

5
@Cyril: Є багато вагомих причин, щоб потурати ненавистю PHP (наприклад, просто подивіться, що згадував Джорн, я цього не знав), але враховуючи, що це в основному нечутливі до випадків, в змішаному випадку немає нічого дивного. вирази однакові. Що за нісенітниця, однак, що вона змішує чутливість до регістру та нечутливість до речей із загальною нечутливістю. (Див. Наприклад: stackoverflow.com/questions/5643496/… )
Sz.

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

Щасливого налагодження! (PHP < 5.1.3 (2 травня 2006 р.) , Див. Демонстрацію )

Редагувати: великі великі булі - це константи, а малі - це значення. Вас цікавить цінність, а не константа, яка може легко змінитися.


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

Фіксації d51599dfcd3282049c7a91809bb83f665af23b696f76b17079a709415195a7c27607cd52d039d7c3 )


7
-1 тому що А) це безглуздо. Б) це не відповідає на запитання. і C) Я вже прийняв правильну відповідь, і це не містить додаткової корисної інформації.
Остін Гайд

36
Тоді дозвольте мені детально пояснити: великі булі - це константи, а нижні регістри - значення. Вас цікавить цінність, а не константа, яка може легко змінитися. Отже, якби ви трохи подумали над текстом і не поспішали б давати штраф, ви, мабуть, це зрозуміли б.
Раду

13
Я розумію, що ви зараз робите (зараз), але те, що ви спочатку зробили, було дурним і безглуздим. Якби ви спочатку просто ви редагували свою відповідь, я б закликав, оскільки це дуже хороший момент.
Остін Гайд

4
Це правильна відповідь. Треба було за це набрати очки.
serialworm

22
Що стосується редагування, що опис трохи вводить в оману ... Самі фактичні значення (які компілюються вниз на лексеми T_NULL, T_TRUEі T_FALSEпід час синтаксичного аналізу), не чутливі до регістру, тому використання NULLв дійсності не є «константою» --- якщо ви не зробите це постійним, використовуючи define(). Просто використовувати NULLабо TRUEне означає, що це константа, як ніби такої постійної немає, PHP інтерпретує це як буквальне. Більш точний опис полягає в тому, що малі версії не можуть бути переосмислені, тоді як будь-які інші зміни в регістрі можуть .
Джо

31

Використовуйте малі літери.

  1. Це простіше набрати. (ІМО)
  2. Простіше читати. (ІМО)
  3. Логічні булеві JavaScript відрізняються малими та великими літерами.

6
+1; Я якраз збирався додати аргумент Javascript: як це дуже ДУЖЕ в веб-програмуванні писати PHP і JS-код, добре розвинені м'язи пальців веб-розробки продовжують регулярно застосовувати той самий регістр букв, який використовується в останньому мовному контексті. Принаймні, я часто опинявся як писати правду чи помилку в Javascript після переходу з PHP. Використання нижнього регістру в PHP зафіксував цей для всіх.
Sz.

11

Якщо ви маєте намір використовувати JSON, тоді RFC7159 говорить:

Буквальні імена ОБОВ'ЯЗКОВО мають бути малими літерами. Інші буквальні імена заборонені.

Зі списку відсталих несумісних змін у PHP 5.6 :

json_decode () тепер відкидає не малі варіанти літери JSON true, false та null, відповідно до специфікації JSON

Відповідно до стандарту PSR-2 :

Ключові слова PHP ОБОВ'ЯЗКОВО мають бути малими літерами.

Константи PHP true, false та null ОБОВ'ЯЗКОВО мають бути малі.


Правильно, але це питання стосувалося найбільших буклів у PHP , а не JSON. Наприклад, json_encode(TRUE)і json_encode(true)врожайність 'true'.
Остін Гайд

3
Вибачте, що згадуєте JSON, було б краще, якби я видалив усі ці посилання та згадав лише PSR-2?
Мандраке

4
Я думаю, що посилання на JSON є доречним, оскільки ви часто використовуєте JavaScript / JSON з PHP, і, можливо, шукаєте послідовності.
Дуг Кресс

9

Раніше я робив буліни стилю C TRUE / FALSE, як і всі consts, з усіма кришками, поки не потрапив на смугу PSR .

Розділ 2.5 PSR-2:

Константи PHP true, false та null ОБОВ'ЯЗКОВО мають бути малі.

Отже, якщо ви хочете добре пограти з деталями стилю з відкритим кодом, булеви повинні бути малими літерами.


5

Не має значення, trueточно так само, як TRUE. Те саме стосується falseі null. Я не чув, щоб це мало значення в будь-якій точці.

Єдиний спосіб ви можете зіпсувати речі, цитуючи ці значення, наприклад:

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

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

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

Єдине, що обмежує або заохочує вас використовувати великі або малі регістри, може бути вашою компанією чи власними рекомендаціями щодо кодування. Крім цього, ви можете користуватися будь-яким, і це не призведе до жодних проблем.


FALSE і NULL - не те саме. is_null () не повертає значення true, якщо значення === FALSE.
Ной Гудрич

9
@Noah Goodrich, я жодного разу цього не мав на увазі falseі nullбув би таким же. Я сказав, що "те саме стосується falseі null", що означало, що обидва можуть бути виражені малими або великими літерами.
Тату Ульманен

5

Я написав простий код, щоб перевірити відмінності між false та FALSE : Кожна ітерація робила щось таке:

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

Ось результати:

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

Тож ми можемо бачити, що ефективність дуже трохи торкається булевих випадків - малі регістри швидше. Але точно не побачиш.


Який двигун JS? В даний час JS складається в пам'яті перед виконанням.
Tiberiu-Ionuț Stan

1
PHP токенізується перед виконанням, і різниці у часі не повинно бути. Інша відповідь вказувала, що верхня частина швидша. Відмінності такої величини в будь-якому тесті слід ігнорувати - ця різниця становить 2,5е-7 за ітерацію.
Doug Kress

4

Особисто я завжди використовував малу форму, але з будь-якої іншої причини, крім того, щоб зробити свій код охайним, єдиним місцем, яким я користуюсь великими літерами, є те, коли назви верблюдних корпусів і назви змінних.

Однією з переваг використання великих літер, що спадає на думку, є те, що вони стирчать і їх легко знайти в коді.


2
+1 за охайність. Всі традиції шапки походять з C, але саме час ми позбудемося цієї потворної форми.
Петруза

2

Я натрапив на це старе питання, задаючи собі те саме. Хороша точка з define ('TRUE', false); define ('FALSE', true); Однак не застосовується до php5. Запис цих рядків у код php5 - це як написання коментаря.


6
Тільки для подальшого ознайомлення ви розмістили це як "відповідь". На StackOverflow, на відміну від традиційних форумів, розмовні повідомлення, які насправді не служать рішенням питання та не надають корисної інформації, повинні розміщуватися як коментар до оригінального запитання чи відповідної відповіді. У цьому випадку ваше повідомлення краще підходить для коментаря до мого питання, ніж відповіді.
Остін Гайд

8
насправді корисно знати, що це більше не працює в PHP 5: P
Алекс

1

Ось мій тест на 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;

Цього разу FALSE вигравав 20 разів. Тож великі регістри швидше знаходяться в моєму середовищі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.