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


135

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

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

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

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


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, falsenull소문자로.


81
그냥 그 지적 할 OR||같다, (서로 다른 우선 순위가 같이) PHP에서 다른 사업자 있습니다 AND&&. (그래서 예를 들어 &&||할당 연산자보다 우선 순위가 있지만 ORAND되지 않습니다.)
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. 동일은 간다 falsenull . 나는 그것이 언제라도 문제가 될 것이라고 들었습니다.

물건을 엉망으로 만들 수있는 유일한 방법은 다음과 같은 값을 인용하는 것입니다.

$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 굿 리치는, 나는 어떤 점에서 그 의미하지 않았다 falsenull같은 것입니다. 나는 "동일 간다라고 false하고 null모두가 낮거나 대문자로 표현 될 수 있다는 것을 의미한다".
Tatu Ulmanen

5

falseFALSE 의 차이점을 확인하기 위해 간단한 코드를 작성했습니다 . 각 반복은 다음 과 같은 작업을 수행했습니다.

    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.