함수형 연산자

함수형 연산자

PHP 8.5부터는 콜러블(callable)에 직접 동작하는 연산자가 하나 있어요. 바로 파이프(|>) 연산자인데, 왼쪽 값을 오른쪽 콜러블에 넘겨 그 결과를 돌려받아요.

출처: Functional Operators

본문

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