다음 코드를 실행하면 무슨 일이 일어날까? (PHP 버전은 8.0이라고 가정한다.)
$version = '1.2.014';
$versions = [
(fn() => $version . '-master')() => 'stable',
(fn() => $version . '-develop')() => 'beta',
];
var_dump($versions); exit;
정답은 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나 열심히 배우려고 해야겠다.