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


9

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

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

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

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

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


해당 Varsolp에 null 통합 연산자를 사용해야합니다 techflirt.com/null-coalescing-operator-php
Ankur Kumar Singh

답변:


7

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

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

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

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


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


현재 내 '팀'은 순전히 나로 구성되어 있습니다. 우리가 일반적으로 구축 한 사이트의 98 %를 호스팅하고 5.3.6 이상을 호스팅하므로 호스팅은 문제가되지 않습니다. 나는 기능 자체가 그렇게 이상하지 않다는 것을 알고 있습니다. 구문의 근간이었던 구문입니다. 더 많은 구문없이 @정의되지 않은 것들에 대한 통지를 숨기려면 null 병합 연산자처럼 작동하지 않는 문제도 있습니다 .
Matthew Scharley

3
@MatthewScharley 네임 스페이스 구분 기호 (\) debacle이 표시이면 이상한 구문이 PHP에서 널리 채택되는 데 장애가되지 않습니다. 실제로 사용하기 시작해야 할 때가 아니라 실제로 사용됩니다.

3

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


주어진 예가 잘못되었습니다 . 의도 한대로 기능을 올바르게 사용 $foo = @$bar ?: 'baz'하는 것은 다음과 같습니다 $foo = (@$bar ? $bar : 'baz'). 그래도 귀하의 의견에 동의합니다.
Matthew Scharley

1

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

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

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

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


0

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

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

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