함수형 연산자
함수형 연산자
PHP 8.5부터는 콜러블(callable)에 직접 동작하는 연산자가 하나 있어요. 바로 파이프(|>) 연산자인데, 왼쪽 값을 오른쪽 콜러블에 넘겨 그 결과를 돌려받아요.
본문
PHP 8.5 이상은 콜러블에 직접 동작하는 연산자를 하나 지원해요. |> 연산자, 즉 "파이프(pipe)"는 오른쪽에 단일 인자 콜러블을 받고, 왼쪽 값을 그 콜러블에 넘겨서 콜러블의 결과로 평가돼요. 오른쪽의 콜러블은 어떤 유효한 PHP 콜러블이든 될 수 있어요. Closure, 일급 콜러블(first-class callable), __invoke()를 구현한 객체 등이죠.
즉, 다음 두 줄은 논리적으로 동일해요.
Example #1 |> 사용하기
<?php
$result = "Hello World" |> strlen(...);
echo $result, PHP_EOL;
$result = strlen("Hello World");
echo $result, PHP_EOL;
?>
위 예제의 출력은 다음과 같아요.
11
11
단일 호출 하나로는 그다지 유용하지 않아요. 여러 호출을 체인으로 이어 붙일 때 진짜 유용해지죠. 즉, 다음 두 코드는 논리적으로 동일해요.
Example #2 |> 호출 체이닝
<?php
$result = "PHP Rocks"
|> htmlentities(...)
|> str_split(...)
|> (fn($x) => array_map(strtoupper(...), $x))
|> (fn($x) => array_filter($x, fn($v) => $v != 'O'))
;
print_r($result);
$temp = "PHP Rocks";
$temp = htmlentities($temp);
$temp = str_split($temp);
$temp = array_map(strtoupper(...), $temp);
$temp = array_filter($temp, fn($v) => $v != 'O');
$result = $temp;
print_r($result);
?>
위 예제의 출력은 다음과 같아요.
Array
(
[0] => P
[1] => H
[2] => P
[3] =>
[4] => R
[6] => C
[7] => K
[8] => S
)
Array
(
[0] => P
[1] => H
[2] => P
[3] =>
[4] => R
[6] => C
[7] => K
[8] => S
)
파이프의 왼쪽은 어떤 값이나 표현식이든 될 수 있어요. 오른쪽은 단일 인자를 받는 유효한 PHP 콜러블이거나, 그런 콜러블로 평가되는 어떤 표현식이든 될 수 있어요. 필수 인자가 두 개 이상인 함수는 허용되지 않으며, 인자가 부족한 상태로 함수를 평범하게 호출한 것처럼 실패해요. 변수를 참조로 받는 함수도 허용되지 않아요. 오른쪽이 유효한 콜러블로 평가되지 않으면 Error를 던져요.
Note:
문법적 모호성을 피하기 위해, 화살표 함수(arrow function)는 파이프 연산자와 함께 쓸 때 위 예제처럼 반드시 괄호로 감싸야 해요. 그렇게 하지 않으면 치명적 오류(fatal error)가 발생해요.
더 알아보기
- Closure