PHP에서 대문자 부울 대 소문자


135

내가 PHP를 배울 때, 나는 당신이 항상 논리 값의 대문자 버전을 사용해야 선가, TRUE그리고 FALSE"정상적인"소문자 버전 때문에, true그리고 false사용에 "안전"하지 않았다.

몇 년이 지났고 필자가 작성한 모든 PHP 스크립트는 대문자 버전을 사용합니다. 그러나 이제는 소문자 버전으로 작성된 많은 PHP (예 : Zend Framework)를 보았으므로 의문의 여지가 있습니다.

대문자 버전을 사용해야하는 이유가 있습니까? 아니면 소문자를 사용하는 것이 완벽합니까?

편집 :이 적용된다는 것을 언급하는 것을 잊었다 NULL및 null뿐만 아니라.


4
소문자를 작성하는 것이 "훨씬 더 빠르다"고 말하지만 심각한 소스는 언급하지 않은 사이트가 많이 있습니다. 어떤 것이 나오는지 관심이 있습니다.
— Pekka

2
그건 사실이 아니야. 5M 반복으로 테스트했으며 PC에서 0.5s로 동일한 결과를 얻었습니다 .P
— Alex

9
@Alex Pekka는 또한 소문자 부울을 실제로 쓰는 것이 더 빠르다 는 것을 의미 할 수 있습니다 . 적은 키를 사용해야하는 것이 합리적입니다. 그러나 그 차이는 매우 작습니다.
— Martti Laine

죄송합니다. 투표 한 후에 실수로 투표를했습니다.
— SIFE

1
흥미로운 관찰 : var_export ()는 true와 false를 소문자로 쓰고 NULL을 대문자로 씁니다. 사랑스러워? 3v4l.org/6Oelk
— donquixote

답변:


89

공식 PHP 매뉴얼은 말합니다 :

부울 리터럴을 지정하려면 키워드 TRUE 또는 FALSE를 사용하십시오. 둘 다 대소 문자를 구분하지 않습니다.

그래 그래서, true === TRUE하고 false === FALSE.

그러나 개인적으로 나는 가독성 을 위해 TRUE반복 true해서 선호합니다 . 그것은 사용에 대한 내 취향에 대해 동일한 이유 를 통해 또는 , 및 사용에 이상 나 .FALSEfalseORor||ANDand&&

PSR-2 표준은 필요 true, false및 null소문자로.


81
그냥 그 지적 할 OR과 ||같다, (서로 다른 우선 순위가 같이) PHP에서 다른 사업자 있습니다 AND와 &&. (그래서 예를 들어 &&및 ||할당 연산자보다 우선 순위가 있지만 OR및 AND되지 않습니다.)
— Johrn

21
또한 오늘의 IDE에서는 순수한 대문자 부울을 대부분의 IDE에 대한 구문 강조 표시기로 사용하는 이유를 크게 구분하지 않습니다.
— RobertPitt

37
나는 소문자를 입력하는 것을 선호하므로 Shift 키를 누를 필요가 없습니다.
— ack

6
나는 자바에서와 같이 소문자를 좋아하지만 거기에는 각자가 있습니다. 그러나 그들이 한 가지 방법으로 정착하고 우리 모두를 하나 또는 다른 것으로 바꾸길 바랍니다. 이것은 내가 실제로 필요한 유연성이 아닙니다!
— Ray

5
@Cyril : PHP를 싫어하는 데에는 충분한 이유가 있습니다 (예 : 위에서 언급 한 Johrn의 내용을 보시면 알 수 없습니다). 기본적으로 대소 문자를 구분하지 않는 경우에는 대소 문자를 구분하는 것이 이상하지 않습니다 같은 표현. 뭐 이다 는 일반 무감각과 대소 문자 구분 및 케이스 - 무감각을 혼합, 그러나, 말도 안되는. (예 : stackoverflow.com/questions/5643496/… )
— Sz.

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

행복한 디버깅! (PHP < 5.1.3 (2006 년 5 월 2 일) , 데모 참조 )

편집 : 대문자 bool은 상수이고 소문자는 값입니다. 상수가 아닌 값에 관심이 있으며 쉽게 변경할 수 있습니다.


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

커밋 d51599dfcd3282049c7a91809bb83f665af23b69 (및 6f76b17079a709415195a7c27607cd52d039d7c3 )


7
A) 이것은 의미가 없기 때문에 -1입니다. B) 이것은 질문에 대답하지 않습니다. 그리고 C) 나는 정답을 이미 받아들였으며 이것은 도움이되는 추가 정보를 제시하지 않습니다 .
— Austin Hyde

36
대문자 bool은 상수이고 소문자는 값입니다. 상수가 아닌 값에 관심이 있으며 쉽게 변경할 수 있습니다. 따라서 텍스트에 대해 조금만 생각하고 페널티를주기 위해 서두르지 않는다면 아마도 이것을 이해했을 것입니다.
— 라두

13
나는 당신이 (지금) 만들고있는 요점을 이해하지만, 당신이 처음에 그것을 만든 방식은 (IMO) 비판적이고 무의미했습니다. 원래 당신이 답을 편집 한 적이 있다면, 이것이 실제로 매우 좋은 점이기 때문에 나는 찬성했을 것입니다.
— 오스틴 하이드

4
이것이 정답입니다. 이것에 대한 요점을 얻었을 것입니다.
— serialworm

22
편집에 관해서는, 그 설명이 좀 오해의 소지가 ... 실제 값 자체 (토큰들로 컴파일 얻을 것이다 T_NULL, T_TRUE그리고 T_FALSE그렇게 사용, 구문 분석 시간), 대소 문자를 구분하는 것은 NULL--- 실제로 "상수"아니다 하지 않는 한 당신이 만드는 그것은 일정한 사용 define(). 단순히 상수를 사용 NULL하거나 TRUE의미하지는 않습니다. 상수가없는 것처럼 PHP는이를 상수로 해석합니다. 더 정확하게 설명 소문자 버전이다 수없는 어떤 다른 경우 변형 반면 재정의 캔 .
— Joe

31

소문자를 사용하십시오.

  1. 입력하기가 더 쉽습니다. (IMO)
  2. 읽기가 더 쉽습니다. (IMO)
  3. JavaScript 부울은 소문자와 대소 문자를 구분합니다.

6
+1; Javascript 인수를 추가하려고했습니다. 웹 프로그래밍에서 PHP와 JS 코드를 작성하는 것은 매우 일반적이므로 잘 개발 된 웹 개발 손가락 근육은 계속해서 마지막 언어 컨텍스트에서 사용되는 것과 동일한 문자를 계속 적용합니다. 적어도 PHP에서 전환 한 후 Javascript로 TRUE 또는 FALSE를 작성하는 경우가 종종 있습니다. PHP에서 소문자를 사용하면이 문제를 해결했습니다.
— Sz.

11

JSON을 사용하려는 경우 RFC7159 는 다음과 같이 말합니다.

리터럴 이름은 소문자 여야합니다. 다른 리터럴 이름은 허용되지 않습니다.

PHP 5.6 의 이전 버전과 호환되지 않는 변경 사항 목록에서 :

json_decode ()는 JSON 사양에 따라 소문자가 아닌 JSON 리터럴의 true, false 및 null을 항상 거부합니다.

에 따르면 PSR-2 표준 :

PHP 키워드는 반드시 소문자 여야합니다.

PHP 상수 true, false 및 null은 반드시 소문자 여야합니다.


맞지만이 질문은 특히 JSON이 아닌 PHP의 대문자 / 소문자 부울과 관련이 있습니다. 예를 들어, json_encode(TRUE)및 json_encode(true)yield 'true'.
— Austin Hyde

3
JSON을 언급 한 것에 대해 죄송합니다. 모든 참조를 제거하고 PSR-2 만 언급하면 ​​더 좋을까요?
— Mandrake

4
PHP와 함께 javascript / JSON을 자주 사용하고 일관성을 찾고 있기 때문에 JSON에 대한 참조가 적절하다고 생각합니다.
— Doug Kress

9

나는 PSR을 얻을 때까지 모든 대문자로 C 스타일 TRUE / FALSE 부울을 모든 대문자로 사용했습니다. 악 대차를 .

PSR-2 섹션 2.5 :

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은 동일하지 않습니다. 값 === FALSE 인 경우 is_null ()은 true를 반환하지 않습니다.
— 노아 굿 리치

9
@Noah 굿 리치는, 나는 어떤 점에서 그 의미하지 않았다 false과 null같은 것입니다. 나는 "동일 간다라고 false하고 null모두가 낮거나 대문자로 표현 될 수 있다는 것을 의미한다".
— Tatu Ulmanen

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.5e-7입니다.
— Doug Kress

4

개인적으로 나는 항상 소문자 형식을 사용했지만 코드를 깔끔하게 보이게하는 것 외에는 특별한 이유가 없기 때문에 대문자를 사용하는 유일한 장소는 낙타 케이싱 클래스 이름과 변수 이름입니다.

그래도 대문자를 사용하면 얻을 수있는 장점 중 하나는 코드에서 쉽게 찾을 수 있다는 것입니다.


2
단정함을 위해 +1. 모든 대문자 전통은 C에서 나왔지만 이제는 그 추악한 형태를 제거 할 때가되었습니다.
— Petruza

2

나는 나 자신에게 같은 것을 요구 하면서이 오래된 질문을 발견했다. define ( 'TRUE', false); define ( 'FALSE', true);와 좋은 점 php5에는 적용되지 않습니다. php5 코드로 이러한 행을 작성하는 것은 주석을 작성하는 것과 같습니다.


6
나중에 참조하기 위해 "답변"으로 게시했습니다. 기존 포럼과 달리 StackOverflow에서는 실제로 질문에 대한 해결책으로 제공되지 않고 유용한 정보를 제공하지 않는 대화 형 게시물은 원래 질문 또는 관련 답변에 대한 의견으로 게시되어야합니다. 이 경우 게시물이 답변보다 내 질문에 대한 의견에 더 적합합니다.
— Austin Hyde

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;

이번에는 FALSE가 20 번 이겼습니다. 내 환경에서 대문자가 더 빠릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.