> 백엔드 개발 > PHP 튜토리얼 > PHP 클로저에 대한 자세한 설명 및 예제 코드

PHP 클로저에 대한 자세한 설명 및 예제 코드

高洛峰
풀어 주다: 2023-03-03 19:58:02
원래의
905명이 탐색했습니다.

PHP5.3.0에는 클로저와 익명 함수가 도입되었습니다.

클로저란 생성 시 주변 상태를 캡슐화하는 함수를 말합니다. 클로저가 위치한 환경이 더 이상 존재하지 않더라도 클로저에 캡슐화된 상태는 여전히 존재합니다.

이론적으로 클로저와 익명함수는 다른 개념입니다. 그러나 PHP는 이를 동일한 개념으로 취급합니다.

사실 클로저나 익명함수는 함수로 위장한 객체입니다. 이는 Closure 클래스의 인스턴스입니다.

문자열 및 정수와 같은 클로저는 최고 수준의 값 유형입니다.

클로저 만들기

<?php
$clousre = function ($name) {
return &#39;Hello &#39; . $name;
};
echo $closure(&#39;nesfo&#39;);
로그인 후 복사

$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(&#39;incrementNum&#39;, [1, 2, 3]);
print_r($numbersPlusOne);
로그인 후 복사

상태 연결

익명 함수는 콜백으로 사용될 수 있을 뿐만 아니라 연결 및 캡슐화될 수도 있습니다. PHP 상태.

PHP에서는 클로저 개체의 바인딩To() 메서드를 수동으로 호출하거나 use 키워드를 사용하여 상태를 PHP 클로저에 연결해야 합니다.

<?php
function enclosePerson ($name) {
return function ($doCommand) use ($name) {
return $name . &#39;, &#39; . $doCommand;
}
}
$clay = enclosePerson(&#39;Clay&#39;);
echo $clay(&#39;get me sweet tea!&#39;);
로그인 후 복사

결과 받기:

"Clay, 달콤한 차 주세요!"

PHP 클로저는 객체이며 각 클로저 인스턴스는 $this 키워드를 사용하여 클로저의 내부 상태를 얻을 수 있습니다. 클로저 객체의 기본 상태는 쓸모가 없으며 __invoke() 메서드와 바인딩To 메서드만 있습니다.

bindTo() 메서드를 사용하여 Closure 객체의 내부 상태를 다른 객체에 바인딩할 수 있습니다.

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

PHP 프레임워크는 라우팅 URL을 익명 콜백 함수에 매핑하기 위해 종종 BindTo() 메서드를 사용합니다. 이렇게 하면 $this 키워드를 사용하여 이 익명 함수에서 중요한 응용 프로그램 개체를 참조할 수 있습니다.

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

<?php
class App
{
protected $routes = [];
protected $responseStatus = &#39;200 OK&#39;;
protected $responseContentType = &#39;text/html&#39;;
protected $responseBody = &#39;Hello world&#39;;
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(&#39;HTTP/1.1&#39; . $this->responseStatus);
header(&#39;Content-type: &#39; . $this->responseContentType);
header(&#39;Content-length&#39; . mb_strlen($this->responseBody));
echo $this->responseBody;
}
}
<br>
로그인 후 복사

<?php
$app = new App();
$app->addRoute(&#39;/user/nesfo&#39;, function () {
$this->responseContentType = &#39;application/json; charset=utf8&#39;;
$this->responseBody = &#39;{"name": "nesfo"}&#39;;
});
$app->dispatch(&#39;/user/nesfo&#39;);
로그인 후 복사

그렇습니다 PHP 폐쇄 정보에 대한 정보를 정리했으며 앞으로도 관련 정보를 계속 추가할 예정입니다. 이 사이트에 대한 귀하의 지원에 감사드립니다!

PHP 클로저 세부사항 및 예제 코드와 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!


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