두 개의 인수만으로 PHP의 삼항 연산자 사용 . PHP

나는 최근에 내 코드 중 일부를 검토하고 결석 한 마음으로 다음과 같은 구조를 남겼다는 것을 알았습니다.

$guid = empty($subscription->guid) ?  : $subscription->guid;

이제, 이것은 예상대로 하고 잘못한 것이 아니 었지만, 그 속성이 항상 설정되었으므로 정상적으로 작동하고 있으며 다음 변경으로 인해 5.3 이후 구문 오류가 없습니다 .

PHP 5.3부터 삼항 연산자의 중간 부분을 생략 할 수 있습니다. expr1 표현식 : expr3은 expr1이 TRUE이면 expr1을 반환하고, 그렇지 않으면 expr3을 반환합니다.

나는이 변화를 알지 못했고 이제 그것을 사용해야하는지 궁금하다. 이것은 ‘실제’부울 또는 a = b || c하나를 얻기 위해 할 수있는 루비와 같은 언어에서 내가 놓친 것입니다. 그러나 삼항 연산자를 위해 선택한 구문은 약간 직관적입니다. 프로덕션 코드에서 이것을 사용해야합니까? 내가 우연히 보았을 때 그것은 내 자신을 던졌다.bc



답변

두 번째 인수가없는 삼항 조건 연산자는 비트 소설이지만 유사하다 1 받는 널 유착 과 같은 다른 알골 파생 언어에서 발견 연산자 C # 펄, 그리고 당신이 언급 한, ||루비 (자바 스크립트) 연산자.

처음에는 이상하게 보이지만 너무 다른 것은 아니지만 (특히 다른 언어의 유사한 연산자에 대한 선례가 있기 때문에) 많은 키 입력을 줄일 수 있습니다. 그리고 네임 스페이스 분리 문자 ( \) 에서 발생한 일 이 어떤 징후이면 PHP 커뮤니티에서 이상한 구문을 채택하게됩니다.

그러나 PHP 응용 프로그램이 직면하는 주요 문제 중 하나는 새 버전의 PHP가 출시 될 때와 호스트가이를 지원하기 시작할 때 (때로는) 엄청나게 긴 지연 시간입니다. 이로 인해 이전 버전의 PHP와 하위 호환성을 유지해야하는 문제가 발생하여 이와 같은 편의 변경을 사용하지 않아도됩니다.

그것이 당신에게 걱정되지 않고 팀이 사용법에 동의한다면 (또는 당신이 솔로 개발자라면 편안하다면), 그것을 위해 가십시오. 네임 스페이스 구분 기호와 마찬가지로, 앞으로 모든 PHP 프로젝트에서 수용 될 수 있을지 여부는 문제가되지 않을 것입니다.


참고 1 : null-coalescing 연산자는 null이 아닌 값 (PHP와 같은 진실한 값은 아님)에 대해서만 테스트하며 ?:구문은 주석에서 언급 한 바와 같이 정의되지 않은 통지를 억제하지 않습니다 .


답변

나에게 그것은 코드의 오류처럼 보입니다. 잘못된 것으로 보이며 일반적으로 몇 번의 키 입력을 저장하기 위해 오류가 발생한 것처럼 보이는 구문을 사용하지 않습니다. 나중에 (또는 다른 사람이) 코드를 다시 읽었을 때 라인이 당신을 트립하고 본질적으로 간단한 작업에 대해 파싱하는 데 시간을 소비해야한다고 생각합니다.


답변

음, PHP는 부울 타입을 가지고 있으며 ||운영자의 PHP 그렇게, 그 결과를 boolen을 반환 $a || $b이와 일치, 논리 형 &&과 마찬가지로 &&둘 중 하나를 반환하는 것이 거의 의미가 있지만 수익에 의미가 있습니다 true/ false. 모든 부울 연산자가 부울 사운드를 반환하도록하는 것도 상당히 논리적입니다.

또한 이것은 PHP의 발명이 아니라 “클래식”PHP의 많은 디자인 요소가 나오는 C를 따릅니다. C99 표준의 §6.5.14에서 인용 :

|| 피연산자 중 하나가 0과 같지 않으면 연산자는 1을 산출합니다. 그렇지 않으면 0이됩니다. 결과는 int 유형입니다.

그리고 글쎄, 당신은? :를 사용해야 하는가 아니면 일반적인 형태로 대답 할 수는 없지만, 마음 : 언어에 대한 가장 좋은 방법은 그것이 제공하는 구문을 사용하고 그것이 제안하는 패러다임을 사용하는 것입니다. C 코드와 같은 Java 코드를 작성하거나 다른 방식으로 작성하는 것은 의미가 없습니다. 😉


답변

나는 그것이 매우 유용한 연산자라고 생각하며 언어 표준이 명시 적으로 정의하기 때문에 분명히 사용해야합니다.

공식적 으로 Grooy 에서 Elvis Operator 라고 불리우며 (왜? 자세히 살펴보십시오!) Java 7에 도입되도록 제안되었습니다.


답변