한 줄 짜리 익명함수는 화살표 함수로 대체하면 코드가 깨끗해지는 느낌이라 요즘 자주 사용하고 있습니다.
$y = 1;
$fn1 = function ($x) use ($y) {
return $x + $y;
};
// $fn1과 같음
$fn2 = fn($x) => $x + $y;
var_export($fn2(3));
// 결과: 4
특히 클로저를 쓰지 않고도 외부 변수를 사용할 수 있는게 편리하더라고요.
하지만 컬렉션의 아이템을 하나씩 처리하면서 외부 변수를 조작하려고 아래와 같은 스타일의 코드를 작성했더니 $someCollection가 변하지 않더군요.
$someCollection = collect();
$collection->each(fn($item) => $someCollection->push($item->doSomething()));
알고보니 원래부터 안되는 것이었습니다. (매뉴얼 참고)
Example #4 Values from the outer scope cannot be modified by arrow functions
https://www.php.net/manual/en/functions.arrow.php
기본적인 내용을 몰라서 삽질을 좀 했네요. #RTFM #매뉴얼을잘읽자
외부 변수를 변경할 필요가 있는 경우엔 화살표 함수를 사용하지 말고 일반 익명함수로 처리해주시면 됩니다.
$someCollection = collect();
$collection->each(function($item) use (&$someCollection) {
$someCollection->push($item->doSomething()));
}