변수의 값이 없을 경우 변수에 array 값으로 확인시 에러 방지를 위한 ?:[] 문의
CMS/프레임워크 | 사용안함 |
---|---|
개발 언어 | PHP 7.2 |
php7.4 이상? 에서 에러가 발생하는
array 가 아닌 변수에 in_array() 등이 사용될 겨우 에러를 방지하기 위해
in_array($val, $array?:[])
?:[] 이렇게 붙여주라고 해서 해결되는 것 까지 이해했었습니다.
그런데 이게 왜 ? 뭐지? 라고 정확히 이해를 해보려고 하는데 참조할 만한 문서가 마땅치 않네요.
혹시 이게 if 축약식 인가요?
$array?$array:$array[]
이것과 같은 의미인가요?
같은 의미라면 왜 $array 가 생략될 수 있는지 이해가 잘 가지 않구요.
혹시 제가 추측하는 것이 틀렸다면
$array?:[] 정확한 의미가 무엇이고 용법이 궁금합니다.
if 축약식 문서를 읽어봤을때는
조건?참일때 실행:거짓일때 실행
위와 같이 이해했는데
$array?:[]
여기에는 참일때 그냥 빈칸이고 거짓일때는 [] 배열을 의미하는 기호 뿐이라.....
댓글 11
$array ? $array : [] 의 축약형이 맞습니다.
PHP 5.3 이후 모든 버전에서 A ? A : B 의 형태는 A ?: B 로 줄여쓸 수 있습니다.
A가 참이면 A를 그대로 쓰고, 아니면 B로 대체합니다.
func() ? func() : B 이렇게 특정 함수의 실행 결과를 가지고 판단해야 할 경우,
원래 문법을 쓰면 (결과를 따로 변수에 담지 않는 이상) 함수를 두 번 실행하는 비효율이 발생하는데
축약형은 한 번만 실행할 수 있다는 장점도 있습니다.
비슷한 문법으로 A ?? B 가 있는데요, 이건 isset(A) ? A : B 의 축약형입니다.
이건 A가 참인지 거짓인지 따지는 것이 아니라 A라는 변수가 존재하는지 아닌지를 따집니다.
PHP 8.0 이상 버전에서 존재하지 않는 변수를 참조할 때 발생하는 워닝을 해결하기 위해
코어에서도 광범위하게 활용하고 있습니다.
A ?: B 로 줄여쓸 수 있습니다.
그럼 A ?여기에 A를 생략하면 : 여기에도 A가 생략된 B 이런 의미가 되는건가요?????
B앞에 A가 생략되지 않은 건지 궁금한데 생략되지 않았다면
[] 이것만 실행이 될 것 같은데 이게 어떤 문법으로 가능한건지도 궁금하네요.
[] 이런식으로 사용해도 변수명이 없는 빈배열로 인식해서 이게 통용이 되는건가요???
죄다 생략하면 안되죠. A ?: B 는 A ? A : B 와 동일한 의미입니다. A와 B를 최소 한 번씩은 참조해야 하니, 의미를 유지하면서 더 줄일 수는 없습니다.
여기서는 [] 의고 [] 는 빈배열이라는 의미로 어떤 배열의 변수이름을 가지지 않고도 사용이 가능하다는 거네요. 감사합니다.
네, 그냥 [] 만 쓰면 array() 와 동일한 의미입니다. (PHP 5.4 이상 지원)
배열에 내용을 추가하는 문법 $array[] = A; 와 똑같이 생겨서 헷갈리는 경우가 많은데
따로 쓰면 그냥 빈 배열이라는 뜻입니다.
흔하게 썼던 이 형식이 저기서 왜 낯설었을까요.... 축약식에서 혼돈이 오니까 이거 마저도 이상해 보였네요 ㅋㅋㅋ
array() 문법에 워낙 익숙해져 있어서 저게 낯설어 보이는 거지, 자바스크립트 등 다른 언어에서는 빈 배열을 [] 로 선언하는 것이 일상적이지요. 따지고 보면 PHP 구 문법도 마치 array(); 라는 함수를 호출하는 것처럼 오해할 소지가 있다는 점에서, 다른 언어 사용자들이 보면 정말 이상할 거예요.
말 나온 김에 list() 문법은 그야말로 최악입니다. 한번 찾아보시길요. ㅋㅋㅋ
$array?:[]
으로 축약되면 $array가 있으면 $array으로 그냥 쓰는거고, 아니면 빈 배열 추가하는 것입니다. []<-빈배열
예를 들어
A() ? A() : B
이런 상황이라면 A라는 함수가 2번 실행되죠.
근데 A() ?: B
이렇게 하면 A라는 함수가 1번만 실행되나요? 아니면 2번 실행되나요?
전 지금까지 1번만 실행된다고 생각했는데 웬지 이 글 읽다보니까 2번 실행되나?
하는 의문이 생겨버렸네요.
맨 위 댓글에 적었듯이 한 번만 실행됩니다.
물론 해당 구문만 보았을 때의 논리적인 의미는 같지만,
A && B 와 B && A 가 서로 다르듯이 (앞의 것이 거짓인 경우 뒤의 것은 실행되지 않음)
실제 실행 과정에 함수가 들어간다면 효율성에 차이가 발생하지요.