Прописные логические значения и строчные в PHP


135

Когда я изучал PHP, я где-то читал, что вы всегда должны использовать версии логических значений в верхнем регистре, TRUEи FALSE, поскольку «нормальные» версии в нижнем регистре trueи false, были небезопасны для использования.

Прошло много лет, и каждый сценарий PHP, который я написал, использует версию в верхнем регистре. Теперь, однако, я сомневаюсь в этом, поскольку я видел много PHP, написанного с использованием строчной версии (например, Zend Framework).

Была ли / была ли когда-либо причина использовать версию в верхнем регистре, или это нормально, чтобы использовать нижний регистр?

edit: Забыл упомянуть, что это относится и к NULLи null.


4
Есть ряд сайтов, утверждающих, что написание строчных букв "намного быстрее", но без ссылок на какие-либо серьезные источники. Интересно посмотреть, появится ли что-нибудь.
Pekka

2
Это не правда. Я тестировал его с 5 миллионами итераций, и оба они дали одинаковые результаты, 0,5 с на моем ПК: P
Alex

9
@Alex Pekka также может означать, что фактическое написание строчных логических значений происходит быстрее. В этом есть смысл, если нужно использовать меньше ключей. Однако разница небольшая.
Martti Laine

Извините, я случайно проголосовал "против" после того, как проголосовал за вас.
SIFE

1
Интересное наблюдение: var_export () записывает true и false в нижнем регистре, а NULL в верхнем регистре. Прекрасно, а? 3v4l.org/6Oelk
донкихот

Ответы:


89

В официальном руководстве по PHP говорится:

Чтобы указать логический литерал, используйте ключевые слова TRUE или FALSE. Оба не чувствительны к регистру.

Так что да, true === TRUEи false === FALSE.

Лично я предпочитаю TRUEснова trueи FALSEснова falseпо причинам удобочитаемости. По той же причине я предпочитаю использовать ORover orили ||и использовать ANDover andили &&.

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


81
Просто хочу отметить, что ORи ||- это разные операторы в PHP (поскольку они имеют разный приоритет), как ANDи &&. (Так, например, &&и ||имеют более высокий приоритет, чем операторы присваивания, но ORи ANDтаковыми не являются.)
Johrn

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

37
Я предпочитаю вводить их в нижнем регистре, поэтому мне не нужно удерживать клавишу Shift.
подтверждено

6
Мне тоже нравятся строчные буквы - как в java, но каждому свое. Однако я бы хотел, чтобы они остановились на ОДНОМ пути и просто заставили нас всех перейти на тот или другой !!!!! Это не та гибкость, которая мне действительно нужна!
Ray

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-код, хорошо развитые мышцы пальцев веб-разработки продолжают регулярно применять тот же регистр букв, что и в контексте последнего языка. По крайней мере, я часто обнаруживал, что пишу TRUE или FALSE в Javascript после перехода с PHP. Использование нижнего регистра в PHP исправило это навсегда.
СЗ

11

Если вы собираетесь использовать JSON, RFC7159 говорит:

Буквальные имена ДОЛЖНЫ быть в нижнем регистре. Никакие другие буквальные имена не допускаются.

Из списка обратно несовместимых изменений в PHP 5.6 :

json_decode () теперь всегда отклоняет нестрочные варианты литералов JSON true, false и null в соответствии со спецификацией JSON.

По стандарту ПСР-2 :

Ключевые слова PHP ДОЛЖНЫ быть в нижнем регистре.

Константы PHP true, false и null ДОЛЖНЫ быть в нижнем регистре.


Правильно, но этот вопрос был конкретно в отношении логических значений верхнего / нижнего регистра в PHP , а не JSON. Например, оба json_encode(TRUE)и json_encode(true)уступают 'true'.
Остин Хайд,

3
Извините за упоминание JSON, было бы лучше, если бы я удалил все эти ссылки и упомянул только PSR-2?
Mandrake

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

9

Раньше я использовал логические значения ИСТИНА / ЛОЖЬ в стиле C, как и все константы, только заглавными буквами, пока не попал на подножку PSR .

Раздел 2.5 ПР-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 () не возвращает истину, если значение === FALSE.
Ной Гудрич

9
@ Ноа Гудрич, я никогда не имел в виду этого 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 компилируется в памяти перед выполнением.
Тибериу-Ионуй Стан

1
PHP токенизируется перед выполнением, и разницы во времени быть не должно. Другой ответ показал, что верх был быстрее. Различия такой величины в любом тесте следует игнорировать - эта разница составляет 2,5e-7 за итерацию.
Дуг Кресс

4

Лично я всегда использовал строчную форму, но без какой-либо конкретной причины, кроме как для того, чтобы мой код выглядел аккуратно, единственное место, где я использую заглавные буквы, - это имена классов верблюжьего корпуса и имена переменных.

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


2
+1 за опрятность. Традиция использования заглавных букв происходит от C, но пора избавиться от этой уродливой формы.
Петруза

2

Я наткнулся на этот старый вопрос, задав себе то же самое. Хороший момент с define ('TRUE', false); define ('FALSE', true); Однако это не относится к php5. Написание этих строк в коде php5 похоже на написание комментария.


6
Просто на будущее, вы разместили это как «ответ». В StackOverflow, в отличие от традиционных форумов, диалоговые сообщения, которые на самом деле не служат решением вопроса и не содержат полезной информации, должны публиковаться как комментарий либо к исходному вопросу, либо к соответствующему ответу. В этом случае ваш пост больше подходит для комментария к моему вопросу, чем для ответа.
Остин Хайд

8
на самом деле полезно знать, что это больше не работает в PHP 5: P
Alex

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;

На этот раз ЛОЖЬ выиграла 20 раз. Так что в моей среде прописные буквы быстрее.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.