if ( ‘constant’== $ variable) 대 if ($ variable == ‘constant’) 작업을 해왔습니다.

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

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

내가 기대했던 곳 :

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

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

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



답변

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

즉, 실수를 저지른 경우 :

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

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

그러나 당신이했다면 :

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

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

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

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

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


답변

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

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

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

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

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

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


답변

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

String foo = null;

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


답변

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

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


답변