TIL PHP 4/18/2024

엽토군·2024년 4월 18일
0

TIL

목록 보기
13/13

배열의 키에 익명함수를 사용;;;

다음 코드를 실행하면 무슨 일이 일어날까? (PHP 버전은 8.0이라고 가정한다.)

$version = '1.2.014';
$versions = [
    (fn() => $version . '-master')() => 'stable',
    (fn() => $version . '-develop')() => 'beta',
];
var_dump($versions); exit;
  1. 길이가 2인 배열이 찍히고 성공 종료된다.
  2. 길이가 2인 배열을 찍은 다음 deprecated 경고가 나고 종료된다.
  3. 3행에서 InvalidArgumentException이 발생한다.
  4. 3행에서 Parse Error가 발생한다.

정답은 1이다.
-_-;;;;;

array(2) {
  ["1.2.014-master"]=>
  string(6) "stable"
  ["1.2.014-develop"]=>
  string(4) "beta"
}

아니 이게 왜 되는 거야??? 어떻게 세상에 이런 게 되는 언어가 있지??? 자바스크립트도 이런 건 안 시켜주는데???

const version = '1.2.014';
let versions = {
  (() => this.version + '-master')() : 'stable', // 여기서 ;을 써야 된다는 오류가 나면서 평가가 중단됨
  (() => this.version + '-develop')() : 'beta'
};

냉정을 되찾고 공식문서를 뒤져 보니 이런 언급이 있긴 있다.

문법 섹션에서 언급했듯이(역주1) 각괄호 사이의 내용은 표현식이어야 합니다. 따라서 이런 코드가 작동합니다.

echo $arr[somefunc($bar)];

* 역주1: 그런 언급은 없다. 단지 PHP가 배열의 키를 어떻게 '캐스팅'하는지에 대한 구구한 설명이 있을 따름이다. 물론 캐스팅이란 게 표현식을 특정 타입으로 평가하는 과정이긴 하지만.

PHP의 배열 자체가 너무 긴장감 없는 구현이라서 이런 것 같다.
알게 된 정보는 써먹든지 피하든지 하려고 해야 할 텐데 이건 써먹을 방법도 피할 방법도 잘 생각이 안 나네...
이제 PHP 8의 시대니까 Ds나 열심히 배우려고 해야겠다.

profile
4년차 PHP 개발자입니다.

0개의 댓글