>  기사  >  백엔드 개발  >  PHP 클로저란 무엇입니까? 클로저 사용 예시에 대한 자세한 설명

PHP 클로저란 무엇입니까? 클로저 사용 예시에 대한 자세한 설명

伊谢尔伦
伊谢尔伦원래의
2017-07-01 10:24:043091검색

이 글에서는 주로 PHP 클로저에 대한 자세한 설명과 예제 코드에 대한 관련 정보를 소개합니다. 도움이 필요한 친구들은 PHP5.3.0에 도입된

클로저와 익명 기능을 참고하세요.

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

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

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

문자열 및 정수와 같은 클로저는 일급 값 유형입니다.

Create closure

<?php
$clousre = function ($name) {
return &#39;Hello &#39; . $name;
};
echo $closure(&#39;nesfo&#39;);

$closure 변수를 호출할 수 있는 이유는 이 변수의 값이 클로저이고 클로저 객체가 호출()magic 메소드을 구현하기 때문입니다. 변수 이름 뒤에 ()가 있으면 PHP는 호출() 메서드를 찾아 호출합니다. 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, get me sweet tea!"

PHP 클로저는 객체이며 각 클로저 인스턴스는 $this 키워드를 사용하여 클로저의 내부 상태를 가져올 수 있습니다. 클로저 객체의 기본 상태는 쓸모가 없으며, 오직 informo() 메소드와 바인딩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;
}
}
<?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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.