if ( 'constant'== $ variable) 대 if ($ variable == 'constant')


48

최근에 PHP에서, 특히 WordPress 프레임 워크에서 많은 작업을 해왔습니다. 나는 다음과 같은 형태로 많은 코드를 주목하고 있습니다.

if ( 1 == $options['postlink'] )

내가 기대했던 곳 :

if ( $options['postlink'] == 1 )

이 규칙은 특정 언어 / 프레임 워크에서 찾을 수 있습니까? 전자의 접근 방식이 후자의 접근 방식보다 선호되는 이유가 있습니까 (처리 관점 또는 구문 분석 관점 또는 심지어 인간 관점)?

아니면 맛의 문제일까요? 테스트를 수행 할 때 항상 상수에 대해 테스트되는 변수 항목이 왼쪽에 있다고 생각했습니다. "초콜릿이 케이크 인 경우"보다는 "케이크가 초콜릿 인 경우"라는 자연 언어로 질문하는 방식에 더 잘 맞는 것 같습니다.


1
나는 결코 그런 코드를 작성하지는 않지만 "초콜릿이 케이크의 맛이라면"자연스럽게 들립니다. 자연어가 더 유연합니다.
Rick Sladkey

4
@Rick 그것은 언어에서 자연스럽게 들릴지 모르지만, 그런 코드를 볼 때, 무엇을하려고하는지 생각하기 위해 먼저 멈추어야한다는 것을 부정 할 수는 없습니다.
Edgar Gonzalez

4
@ Edgar Gonzalez : 동의합니다. 코드에서 확실하게 반대합니다.
Rick Sladkey

3
Code Complete 2nd Edition의 19 장 ( "부울 식 : 부울 식의 일반적인 문제"섹션에 있음)은 실제로 여기에있는 많은 답변에 명시된 정확한 이유 때문에이 방법을 권장합니다. .
CraigTP

4
나는 종종 이것을 "요다 조건"이라고 부르는 것을 보았습니다
Brian

답변:


83

이를 수행하는 주된 이유 (소위 "요다 조건부")는 실수로 =등호 비교 연산자 ( ==) 대신 대입 연산자 ( )를 사용하는 사고를 방지하기위한 것입니다 .

즉, 실수를 저지른 경우 :

$foo = 5;
if ($foo = 1) {
  // Stuff
}

이 문장은 true(또는 PHP와 같은 일부 언어의 경우 진실한 값으로) 평가되며 찾기 어려운 버그가 있습니다.

그러나 당신이했다면 :

$foo = 5;
if (1 = $foo) {
  // Stuff
}

$foo정수를 할당 할 수 없으므로 치명적인 오류가 발생 합니다.

그러나 지적했듯이 순서를 반대로하면 일반적으로 읽기가 어렵습니다. 따라서 많은 코딩 표준 ( WordPress 포함 ) $foo == 1이 버그 헌팅의 이점에도 불구하고 제안하거나 요구합니다 1 == $foo.

일반적으로 저의 조언은 존재하는 기존의 코딩 표준이있는 경우에 따라 수행하는 것입니다. WordPress의 경우 Yoda 조건부 사용을 의미합니다.

존재하지 않고 동료와 합의를 통해 하나를 설립하는 것이 불가능한 경우, 딜러의 선택입니다.


2
언어를 설계 할 때 (오래 전에) 이런 종류의 문제를 피하기 위해 :=할당 연산자 ( ==균등 테스트 용) 로 만들었습니다 .
Donal Fellows

7
나는 코드의 많은, 많은, 라인을 작성했습니다, 나는 한 결코 실수로 입력하지 =대신 ==. 그 차이는 어느 곳에서나 강조되어 혼란스럽지 않습니다. 반면에, 혼란 스럽거나 이해하기 어려운 많은 코드를 읽었습니다. 따라서 가독성에 우선 순위를 두었습니다. :). 어쨌든 좋은 대답입니다.
crazy2be

5
또 다른 좋은 이유 -Wall -Werror또는 컴파일러 / 통역가 를 사용해야 합니다. 조건 내 할당이 더 정확하고 읽기 쉬운 상황은 거의 없습니다. 많은 언어는 그것을 허용하지 않습니다.
Karl Bielefeldt

7
Pedantic : 일부 언어에서는 if($foo = 1)평가 되지만 truePHP에서는 1로 평가됩니다. if($foo = 20)20으로 평가; if($foo = 0)0으로 평가되며 다른 것과 달리 거짓입니다. 이것은 버그에 전체적인 다른 복잡성 계층을 추가 할 수 있습니다.
Charles

2
사실, 코딩 표준 워드 프레스는 요다 조건문에 대한 호출을 수행합니다 codex.wordpress.org/WordPress_Coding_Standards#Yoda_Conditions
톰 오거

13

할당 연산자를 실수로 사용하는 것을 방지하기위한 방어 적 코딩 메커니즘입니다.

등식 연산자 대신 할당 연산자의 오용 / 오류를 고려하십시오.

if ( $options['postlink'] = 1  )

위의 조건은 항상 true를 반환하지만 원래 프로그래머가 생각한 것이 아닐 수도 있습니다. 그 자리에서 이것을 고려하십시오.

if( 1 = $options['postlink'])

여기서 고정 된 값에 아무것도 할당 할 없으므로 PHP (및 대부분의 다른 언어)는 실행을 거부합니다 1. 이러한 방식으로 모든 조건문을 코딩하면 조건부에서 할당 연산자를 실수로 사용하지 않습니다.


9

null 포인터 예외의 가능성을 제거하기 위해 Java에서 해당 규칙을 사용하는 것이 좋습니다. 따라서 이와 같은 것이 문제를 일으키거나 추가 코드가 필요하지 않습니다.

String foo = null;

if ("bar".equals(foo))
{
    //Do something
}

3
나는 이것을 좋아하지만 일반적인 관용구가 싫어.
토마스 에딩

3
코드의 해당 지점에서 null 값이 유효하지 않은 경우 이미 null 값을 확인했거나 null 값이 불가능한 방식으로 코드를 설계해야합니다.
Ed S.

6
이것은 문제를 숨기는 쉬운 방법 인 것 같습니다. 카펫 내부의 먼지를 으 by하여 먼지를 청소하지 마십시오.
Lie Ryan

0

실제로 많은 컴파일러는 실수 일 가능성이 있기 때문에 "if (x == 1)"대신 "if (x = 1)"을 쓰면 경고를 표시합니다.

Clang을 사용하면 컴파일러에게 "내가하고있는 것을 알고 있습니다"라는 말을 효과적으로 지시함으로써 경고를 피할 수 있으며, "if ((x = 1))"라고 작성하면됩니다. 추가 괄호에 유의하십시오. 그것은 다른 상황에서도 작동합니다. if (거짓) 진술; 명령문이 실행되지 않는다는 경고를 표시 할 수 있습니다. if ((false)) 문; 그 경고를하지 않습니다.


나는 그것을 많이 좋아한다! 필자는 IDE에서 항상 경고를 받기 때문에 PHP에서 다음과 같은 완전 관용구를 피합니다.if ($array = getSomething()){ // ..so something with $array }
Tom Auger
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.