상현에 하루하루
개발자의 하루

PHP8.1: First-Class Callables

( 업데이트: )

PHP 8.1에서 호출 가능한 구문을 작성하는 새로운 방법인 First-Class 호출

이전에는 다음과 같이 작성할 수 있었습니다.

$foo = [ $this, 'foo' ];
$strlen =  Closure::fromCallable( 'strlen');Code language: PHP (php)

즉, 다른 종류의 함수를 참조하는 클로저를 생성하여 해당 클로저를 변수로 사용할 수 있습니다.

이것은 내가 성가신 부분이었습니다. 실제 함수를 참조하는 데 사용되는 ‘문자열’ 이름과 배열에 대해 이야기하는 것입니다.

이러한 클로저를 생성하기 위한 적절한 내장 구문입니다!

다음과 같이 생성하면 됩니다.

$foo = $this->foo(...);
$strlen = strlen(...);Code language: PHP (php)

점 3개 보이나요? 스프레드 연산자와 비슷해 보이지만 이 맥락에서 의미하는 바는 다릅니다. 그것들은 우리가 실제로 함수를 호출하는 것이 아니라 대신 그 함수를 호출하는 클로저를 저장한다는 것을 나타내는 새로운 방법입니다.

함수가 허용하는 인수의 양에 관계없이 이 세개의 점만 작성할 수 있습니다.

그리고 이 구문은 정적 함수와 함께 작동 가능합니다.

$foo = MyClass::foo(...);Code language: PHP (php)

그래도 작동하지 않는 것은 비정적 함수를 정적으로 참조하는 것입니다.

호출 가능 항목을 생성하려면 클래스의 실제 인스턴스가 필요합니다. 따라서 다음과 같이 작동하지 않습니다.

class MyController {
  public function index () {
    /* ... */
  }
}

$action = MyController::index(...); // Error!!Code language: PHP (php)

이것은 First-Class Callable의 사용을 약간 제한할 수 있다. 하지만 여전히 개선된 점은 아주 기쁩니다.