질문/조언질답게시판

php7.4 이상? 에서 에러가 발생하는 

array 가 아닌 변수에  in_array() 등이 사용될 겨우 에러를 방지하기 위해 

 

in_array($val, $array?:[])

 

?:[] 이렇게 붙여주라고 해서 해결되는 것 까지 이해했었습니다.

 

그런데 이게 왜 ? 뭐지? 라고 정확히 이해를 해보려고 하는데 참조할 만한 문서가 마땅치 않네요.

 

혹시 이게 if 축약식 인가요?

 

$array?$array:$array[]

이것과 같은 의미인가요?

 

같은 의미라면 왜 $array 가 생략될 수 있는지 이해가 잘 가지 않구요.

 

혹시 제가 추측하는  것이 틀렸다면 

$array?:[] 정확한 의미가 무엇이고 용법이 궁금합니다.

 

if 축약식 문서를 읽어봤을때는 

조건?참일때 실행:거짓일때 실행

 

위와 같이 이해했는데

 

$array?:[]

 

여기에는 참일때 그냥 빈칸이고 거짓일때는 [] 배열을 의미하는 기호 뿐이라.....

 

  • profile

    $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 이상 버전에서 존재하지 않는 변수를 참조할 때 발생하는 워닝을 해결하기 위해

    코어에서도 광범위하게 활용하고 있습니다.

  • profile profile

    A ?: B 로 줄여쓸 수 있습니다.

    그럼 A ?여기에 A를 생략하면 : 여기에도 A가 생략된 B 이런 의미가 되는건가요?????

     

    B앞에 A가 생략되지 않은 건지 궁금한데 생략되지 않았다면 

    [] 이것만 실행이 될 것 같은데 이게 어떤 문법으로 가능한건지도 궁금하네요.

     

    [] 이런식으로 사용해도 변수명이 없는 빈배열로 인식해서 이게 통용이 되는건가요???

  • profile profile

    죄다 생략하면 안되죠. A ?: B 는 A ? A : B 와 동일한 의미입니다. A와 B를 최소 한 번씩은 참조해야 하니, 의미를 유지하면서 더 줄일 수는 없습니다.

  • profile profile
    아 그럼 B는 그냥 B 인거군요.
    여기서는 [] 의고 [] 는 빈배열이라는 의미로 어떤 배열의 변수이름을 가지지 않고도 사용이 가능하다는 거네요. 감사합니다.
  • profile profile

    네, 그냥 [] 만 쓰면 array() 와 동일한 의미입니다. (PHP 5.4 이상 지원)
    배열에 내용을 추가하는 문법 $array[] = A; 와 똑같이 생겨서 헷갈리는 경우가 많은데

    따로 쓰면 그냥 빈 배열이라는 뜻입니다.

  • profile profile
    $array = [];

    흔하게 썼던 이 형식이 저기서 왜 낯설었을까요.... 축약식에서 혼돈이 오니까 이거 마저도 이상해 보였네요 ㅋㅋㅋ
  • profile profile

    array() 문법에 워낙 익숙해져 있어서 저게 낯설어 보이는 거지, 자바스크립트 등 다른 언어에서는 빈 배열을 [] 로 선언하는 것이 일상적이지요. 따지고 보면 PHP 구 문법도 마치 array(); 라는 함수를 호출하는 것처럼 오해할 소지가 있다는 점에서, 다른 언어 사용자들이 보면 정말 이상할 거예요.

     

    말 나온 김에 list() 문법은 그야말로 최악입니다. 한번 찾아보시길요. ㅋㅋㅋ

  • profile
    {조건문} ? {조건문이 TRUE일 경우} : {조건문이 FALSE일 경우}

    $array?:[]
    으로 축약되면 $array가 있으면 $array으로 그냥 쓰는거고, 아니면 빈 배열 추가하는 것입니다. []<-빈배열
  • profile profile
    네. 정확히 지금 말씀 하신대로 동작하는건데 이게 array 형식을 취하는 방법이 다양하다보니 당연하게 이상해 보였네요.
  • ?
    그런데 궁금한게 A ?: B 는 A ? A : B 하고 동작 자체는 똑같은데 표현만 축약된건가요?
    예를 들어
    A() ? A() : B
    이런 상황이라면 A라는 함수가 2번 실행되죠.
    근데 A() ?: B
    이렇게 하면 A라는 함수가 1번만 실행되나요? 아니면 2번 실행되나요?
    전 지금까지 1번만 실행된다고 생각했는데 웬지 이 글 읽다보니까 2번 실행되나?
    하는 의문이 생겨버렸네요.
  • ? profile

    맨 위 댓글에 적었듯이 한 번만 실행됩니다.
    물론 해당 구문만 보았을 때의 논리적인 의미는 같지만,
    A && B 와 B && A 가 서로 다르듯이 (앞의 것이 거짓인 경우 뒤의 것은 실행되지 않음)
    실제 실행 과정에 함수가 들어간다면 효율성에 차이가 발생하지요.