PHP의 클로저 및 익명 함수 분석

小云云
풀어 주다: 2023-03-18 12:38:01
원래의
1447명이 탐색했습니다.

클로저는 생성 시 주변 상태를 캡슐화하는 기능입니다. 클로저가 위치한 환경이 더 이상 존재하지 않더라도 클로저에 캡슐화된 상태는 여전히 존재합니다. PHP 클로저 및 익명 함수는 일반 함수와 동일한 구문을 사용하지만 클로저 및 익명 함수는 실제로 함수로 위장한 객체(Closure 클래스의 인스턴스)입니다. PHP의 클로저와 익명 기능에 대한 지식을 소개하겠습니다. 필요한 친구들이 참고하면 도움이 될 것입니다.

익명함수는 이름이 없는 함수입니다. 익명 함수는 변수에 할당될 수 있으며 다른 PHP 객체처럼 전달될 수 있습니다. 그러나 익명 함수는 여전히 함수이므로 호출할 수 있고 매개변수를 전달할 수 있습니다. 익명 함수는 함수나 메서드에 대한 콜백으로 특히 적합합니다.

참고: 이론적으로 클로저와 익명 함수는 다른 개념입니다. 그러나 PHP는 이를 동일한 개념으로 취급합니다. 따라서 클로저를 언급할 때 익명 함수도 언급하고 그 반대의 경우도 마찬가지입니다.

PHP 클로저 및 익명 함수는 일반 함수와 동일한 구문을 사용하지만 클로저 및 익명 함수는 실제로 함수로 위장한 객체(클로저 클래스의 인스턴스)입니다.

클로저 만들기

$closure = function($name){
  return sprintf("Hello %s", $name);
}
echo $closure("jerry");
// 检测$closure变量是否是一个闭包
var_dump($closure instanceof Closure);
로그인 후 복사

위 코드는 클로저 개체를 만든 다음 $closure 변수에 할당합니다. 클로저는 일반 PHP 함수와 매우 유사하며 동일한 구문을 사용하고 매개변수를 수신하며 값을 반환할 수 있습니다.

설명: $closure 변수를 호출할 수 있는 이유는 이 변수의 값이 클로저이고 클로저 객체가 __invoke() 매직 메서드를 구현하기 때문입니다. 변수 이름 뒤에 ()가 있는 한, PHP는 __invoke() 메서드를 찾아 호출합니다.

클로저 사용

우리는 일반적으로 함수와 메서드에 대한 콜백으로 PHP 클로저를 사용합니다. 많은 PHP 함수는 array_map() 및 preg_replace_callback()과 같은 콜백 함수를 사용합니다. 다음 예에서는 array_map()을 사용하여 배열을 처리하고 배열의 각 항목을 1씩 증가시킵니다.

$nubmers = array_map(function($number){
  return $number++;
}, [1,2,3]);
var_dump($numbers);
로그인 후 복사

Additional state

PHP 클로저는 실제 javascrypt 클로저처럼 애플리케이션 상태를 자동으로 캡슐화하지 않습니다. 클로저 개체의 바인딩To() 메서드를 수동으로 호출하거나 use 키워드를 사용하여 상태를 PHP 클로저에 연결해야 합니다.

use 키워드 사용

클로저 상태를 첨부하기 위해 use 키워드를 사용하는 것이 더 일반적이므로 먼저 이 방법을 살펴보겠습니다. use 키워드를 사용하여 클로저에 변수를 연결하면 연결된 변수는 연결될 때 할당된 값을 기억합니다.

function Car ($name){
  return function($statu)use($name){
    return sprintf("Car %s is %s", $name, $statu); 
  }
}
// 将车名封装在闭包中
$car = Car("bmw");
// 调用车的动作
// 输出--> "bmw is running"
echo $car("running");
로그인 후 복사

참고: 클로저에 여러 매개변수를 전달하려면 use 키워드를 사용하세요. 이 경우 PHP 함수나 메서드의 매개변수처럼 여러 매개변수를 구분하려면 쉼표를 사용하세요.

bindTo() 메소드를 사용하여 클로저의 상태를 첨부하세요.

다른 PHP 객체와 마찬가지로 각 클로저 인스턴스는 $this 키워드를 사용하여 클로저의 내부 상태를 얻을 수 있습니다. 클로저 객체의 기본 상태는 쓸모가 없지만 __invoke() 매직 메서드와 binTo() 메서드가 있습니다.

bindTo() 메서드는 클로저에 몇 가지 흥미로운 잠재력을 추가합니다. 이 메서드를 사용하여 Closure 객체의 내부 상태를 다른 객체에 바인딩할 수 있습니다.

bindTo() 메소드의 두 번째 매개변수는 바인딩 클로저의 객체가 속하는 PHP 클래스를 지정하는 것입니다. 따라서 클로저는 클로저가 바인딩된 개체의 보호된 멤버 변수와 전용 멤버 변수에 액세스할 수 있습니다.

class TestClosure
{
  private $name=[];
  private $age;
  private $sex;
  public function addPerson($name, $personCallback){
    // 将闭包对象绑定当前实例
    $this->name[$name] = $personCallback->bindTo($this, __CLASS__);
  }
  public function display($name){
    foreach ($this->name as $key => $callback){
      if($key == $name){
        // 执行闭包对象,将闭包状态附加到类
        $callback();
      }
    }
    echo "name : {$name}\n";
    echo "age : {$this->age}\n";
    echo "sex : {$this->sex}\n";
  }
}
$person = new TestClosure();
$person->addPerson("jerry", function(){
  $this->age = 19;
  $this->sex = "man";
});
$person->display("jerry");
/** output
name : jerry
age : 19
sex : man
*/
로그인 후 복사

관련 권장 사항:

PHP에서 외부 변수를 얻기 위해 클로저를 사용하는 방법

Javascript 클로저에 대한 심층적인 이해

익명 함수, 중첩 함수 및 클로저란 무엇입니까?

위 내용은 PHP의 클로저 및 익명 함수 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿