PHP5.3.0에는 클로저와 익명 함수가 도입되었습니다.
클로저란 생성 시 주변 상태를 캡슐화하는 함수를 말합니다. 클로저가 위치한 환경이 더 이상 존재하지 않더라도 클로저에 캡슐화된 상태는 여전히 존재합니다.
이론적으로 클로저와 익명함수는 다른 개념입니다. 그러나 PHP는 이를 동일한 개념으로 취급합니다.
사실 클로저나 익명함수는 함수로 위장한 객체입니다. 이는 Closure 클래스의 인스턴스입니다.
문자열 및 정수와 같은 클로저는 최고 수준의 값 유형입니다.
클로저 생성
<?php $clousre = function ($name) { return 'Hello ' . $name; }; echo $closure('nesfo');
$closure 변수를 호출할 수 있는 이유는 이 변수의 값이 클로저이고, 클로저 객체가 __invoke( ) 매직을 구현하기 때문입니다. 방법. 변수 이름 뒤에 ()가 있으면 PHP는 __invoke() 메서드를 찾아 호출합니다. PHP 클로저는 일반적으로 함수의 콜백으로 사용됩니다. array_map() 및 preg_replace_callback() 메소드는 모두 콜백 함수를 사용합니다. 이때가 클로저를 사용하기에 가장 좋은 시기입니다.
예:
<?php $numbersPlusOne = array_map(function ($number) { return $number + 1; }, [1, 2, 3]); print_r($numbersPlusOne);
결과 가져오기:
[2, 3, 4]
클로저 이전에는 이름이 지정된 함수만 개별적으로 생성한 다음 해당 함수를 이름으로 참조할 수 있었습니다. 이렇게 하면 코드 실행이 약간 느려지고 콜백 구현이 사용 시나리오에서 격리됩니다.
<?php function incrementNum ($number) { return $number + 1; } $numbersPlusOne = array_map('incrementNum', [1, 2, 3]); print_r($numbersPlusOne);
상태 첨부
익명 함수는 콜백으로 사용될 수 있을 뿐만 아니라 PHP에 대한 상태를 첨부하고 캡슐화할 수도 있습니다.
PHP에서는 클로저 개체의 바인딩To() 메서드를 수동으로 호출하거나 use 키워드를 사용하여 상태를 PHP 클로저에 연결해야 합니다.
<?php function enclosePerson ($name) { return function ($doCommand) use ($name) { return $name . ', ' . $doCommand; } } $clay = enclosePerson('Clay'); echo $clay('get me sweet tea!');
결과 얻기:
"Clay, get me sweet tea!"
PHP 클로저는 객체이며 각 클로저 인스턴스를 사용할 수 있습니다. 클로저의 내부 상태를 얻으려면 $this 키워드를 사용하십시오. 클로저 객체의 기본 상태는 쓸모가 없으며 __invoke() 메서드와 바인딩To 메서드만 있습니다.
bindTo() 메서드를 사용하여 Closure 객체의 내부 상태를 다른 객체에 바인딩할 수 있습니다.
bindTo() 메소드의 두 번째 매개변수: 해당 기능은 바인딩 클로저의 객체가 속하는 PHP 클래스를 지정하는 것입니다. 따라서 클로저는 클로저가 바인딩된 개체의 보호된 멤버와 전용 멤버에 액세스할 수 있습니다.
PHP 프레임워크는 라우팅 URL을 익명 콜백 함수에 매핑하기 위해 종종 BindTo() 메서드를 사용합니다. 이렇게 하면 $this 키워드를 사용하여 이 익명 함수에서 중요한 응용 프로그램 개체를 참조할 수 있습니다.
bindTo() 메소드를 사용하여 클로저 상태 첨부
<?php class App { protected $routes = []; protected $responseStatus = '200 OK'; protected $responseContentType = 'text/html'; protected $responseBody = 'Hello world'; public function addRoute($routePath, $routeCallback){ $this->routes[$routePath] = $routeCallback->bindTo($this, __CLASS__); } public function dispatch($currentPath){ foreach($this->routes as $routePath => $callback){ if ($routePath === $currentPath) { $callback(); } } header('HTTP/1.1' . $this->responseStatus); header('Content-type: ' . $this->responseContentType); header('Content-length' . mb_strlen($this->responseBody)); echo $this->responseBody; } } <br>
<?php $app = new App(); $app->addRoute('/user/nesfo', function () { $this->responseContentType = 'application/json; charset=utf8'; $this->responseBody = '{"name": "nesfo"}'; }); $app->dispatch('/user/nesfo');
위 내용은 PHP 클로저 정보 모음입니다. 미래. 이 기사를 검토해 주셔서 감사합니다.
PHP 클로저 세부사항 및 예제 코드와 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!