profile

이 세상에 하나는 남기고 가자

세상에 필요한 소스코드 한줄 남기고 가자

PHP 삼항 연산자 : Ternary Operator 와 Null Coalesce Operator

유영재

PHP에도 삼항 연산자:Ternary operator 가 있다. 메뉴얼에는 아래와 같이 설명되어 있다.

<?php
// 사용 예제: 삼항 연산자
$action = (empty($_POST['action'])) ? 'default' : $_POST['action'];

// 위 예제는 다음의 if/else 구문과 동일합니다
if (empty($_POST['action'])) {
    $action = 'default';
} else {
    $action = $_POST['action'];
}

(expr1) ? (expr2) : (expr3) 표현은 expr1이 TRUE이면 expr2로 평가되고, expr1이 FALSE이면 expr3로 평가됩니다. PHP 5.3부터, 삼항 연산자의 중간 부분을 비울 수 있습니다. 표현식 expr1 ?: expr3은 expr1이 TRUE이면 expr1, 아니면 expr3를 반환합니다.

PHP 5.3부터 expr2를 비울 수 있다고 되어 있다. 다시 말해 (expr1) ?: (expr3)라는 표현을 사용할 수 있다.

그리고 한가지. 아래와 같이 삼항식을 중첩할 경우는 괄호를 사용해서 묶어줄 것을 권장한다.

삼항 연사자를 "쌓는" 일을 피하길 권합니다. 하나의 구문에서 하나를 초과하는 삼항 연산자를 사용할 때, PHP 작동은 명확하지 않습니다: Example #3 명확하지 않은 삼항 작동

<?php
// 얼핏 보기에, 'true'를 출력할 것 같습니다
echo (true?'true':false?'t':'f');

// 그러나 위의 실제 출력은 't'입니다
// 이는 삼항 표현이 왼쪽에서 오른쪽으로 평가되기 때문입니다

// 다음이 위 코드와 동일한 더 명확한 버전입니다
echo ((true ? 'true' : 'false') ? 't' : 'f');

// 여기서, 첫 표현이 'true'로 평가되고, 이것이
// (bool)true로 전환되어 평가된 후, 두 번째
// 삼항 표현의 true쪽을 반환합니다.
?>
add a note add a note

이와 유사하지만 다른 삼항 연산자인 Null 병법 연산자:Null Coalesce Operator가 PHP 7부터 지원된다. 한글 이름을 딱히 뭐라 부를지가 애매한데 위키피디아에서 "Null 병법 연산자"라는 이름을 사용하고 있다.

isset($_GET['mykey']) ? $_GET['mykey'] : ""

위 두가지 삼항식은 동일한 것 같지만 자세히보면 다르다. 한가지는 empty를 다른 한가지는 isset을 대체한다.

그리고 한가지 알아야할 중요한 사항이 있다. PHP ternary operator vs null coalescing operator에 예시가 나와 있듯이 ?:는 선언되지 않은 변수를 사용할 경우 E_NOTICE가 발생한다. 다시말해 완전히 empty 처럼 동작하는 것은 아니다.

comments powered by Disqus