PHP의 클로저(Closure)는 PHP5.3부터 도입된 익명함수입니다.
클로저의 구문은 매우 간단합니다. 주의가 필요한 유일한 키워드는 클로저와 외부 변수를 연결하는 use입니다.
$a = 함수() 사용($b) {}
간단한 예는 다음과 같습니다.
함수 콜백($fun) {
$재미();
}
$msg = "안녕하세요 여러분";
$fun = 함수 () 사용($msg) {
print "이것은 클로저 사용 문자열 값입니다. msg는 $msg입니다.
/n";
};
$msg = "안녕하세요 여러분";
콜백($fun);
결과는 다음과 같습니다. 클로저 사용 문자열 값입니다. msg는 다음과 같습니다.
/n
PHP의 새로운 개방형 클로저 구문에서는 클로저 외부에 정의된 변수를 사용하기 위해 use를 사용합니다. 여기서는 외부 변수 $msg를 사용합니다. 정의된 후 해당 값이 변경되고 클로저가 실행되면 원래 값이 출력됩니다. 값으로 전달되는 기본 유형 매개변수의 경우 클로저 사용 값은 클로저가 생성될 때 결정됩니다.
미니어플리케이션은 다음과 같습니다.
/**
* 클로저를 사용한 카운터 생성기
* 실제로 Python에 도입된 클로저의 예를 기반으로 한 것입니다...
* 우리는 다음과 같이 생각할 수 있습니다:
* 1. 카운터 함수가 호출될 때마다 지역 변수 $counter가 생성되어 1로 초기화됩니다.
* 2. 그런 다음 로컬 변수 $counter에 대한 참조를 생성하는 클로저를 만듭니다.
* 3. counter 함수는 생성된 클로저를 반환하고 로컬 변수를 소멸하는데 이때 클로저에서 $counter에 대한 참조가 있습니다.
* 재활용되지 않습니다. 따라서 함수 카운터에 의해 반환된 클로저는 무료
를 전달하는 것으로 이해할 수 있습니다.
* 변수
* 4. 각 카운터 호출은 독립적인 $counter 및 클로저를 생성하므로 반환된 클로저는 서로 독립적입니다.
* 5. 반환된 클로저를 실행하고, 포함된 자유 상태 변수를 증가시키고 반환하면 결과는 카운터입니다
.
* 결론: 이 기능은 독립적인 카운터를 생성하는 데 사용할 수 있습니다.
*/
함수 카운터() {
$카운터 = 1
반환 함수() use(&$counter) {return $counter ;};
}
$counter1 = 카운터()
$counter2 = 카운터()
echo "counter1: " . $counter1() . "
/n";
echo "counter1: " . $counter1() . "
/n";
echo "counter1: " . $counter1() . "
/n";
echo "counter1: " . $counter1() . "
/n";
echo "counter2: " . $counter2() . "
/n";
echo "counter2: " . $counter2() . "
/n";
echo "counter2: " . $counter2() . "
/n";
echo "counter2: " . $counter2() . "
/n";
?>
마감의 역할
1. foreach 루프의 코드를 줄입니다
예를 들어, 매뉴얼의 예시 Cart
http://php.net/manual/en/functions.anonymous.php
코드 복사
코드는 다음과 같습니다.
// 추가된 일부 항목과 각 항목의 수량을 포함하는 기본 장바구니입니다.
// 장바구니에 담긴 모든 품목의 총 가격을 계산하는 데 메소드 중 하나가 사용됩니다. 이 메서드는 클로저를 콜백 함수로 사용합니다.
클래스 카트
{
const PRICE_BUTTER = 1.00;
const PRICE_MILK = 3.00;
const PRICE_EGGS = 6.95;
$products = array();
공개 기능 추가($product, $quantity)
{
$this->제품[$product] = $수량;
}
공개 함수 getQuantity($product)
{
반환 isset($this->products[$product]) ? $this->products[$product] :
거짓;
}
공개 함수 getTotal($tax)
{
$total = 0.00;
$callback =
함수($yang, $product) 사용($tax, &$total)
{
$pricePerItem = 상수(__CLASS__ . "::PRICE_" .
strtoupper($product));
$total = ($pricePerItem * $Quantity) * ($tax 1.0);
};
//사용자 정의 함수를 사용하여 배열의 각 요소에 대해 콜백 처리를 수행합니다
array_walk($this->products, $callback);
왕복($total, 2);;
}
}
$my_cart = 새 장바구니;
// 장바구니에 항목 추가
$my_cart->add('버터', 1);
$my_cart->add('우유', 3);
$my_cart->add('계란', 6);
// 판매세 5%를 포함한 총 가격을 출력합니다.
$my_cart->getTotal(0.05) "n"을 인쇄합니다.
// 결과는 54.29
?>
여기서 getTotal 함수를 변환하려면 foreach를 사용해야 합니다.
2. 기능 매개변수 줄이기
함수 html($code , $id="", $class=""){
if ($id !== "") $id = " id = "$id"" ;
$class = ($class !== "")? " 클래스 ="$class">":">";
$open = "<$code$id$class";
$close = "$code>";
반환 함수($inner = "") 사용($open, $close){
"$open$inner$close"를 반환합니다.
};
}
일반적인 방법을 사용한다면 html 함수 매개변수에 inner 를 넣을 것이기 때문에 코드를 읽을 때나 사용할 때나 클로저를 사용하는 것이 더 좋습니다.
3. 재귀 기능 잠금 해제
$fib = 함수($n) 사용(&$fib) {
If($n == 0 || $n == 1) 1을 반환합니다.
$fib($n - 1) $fib($n - 2) 반환;
};
에코 $fib(2) . "n" // 2
$거짓말 = $fib;
$fib = function(){die('error');};//$fib 변수 다시 쓰기
echo $lie(5); // $fib가 클로저에 의해 참조되었기 때문에 오류가 발생했습니다
위 질문에서 &를 사용한다는 점에 유의하세요. 여기서 &를 사용하지 않으면 fib(n-1)이 함수를 찾을 수 없습니다(fib 유형이 이전에 정의되지 않았습니다)
따라서 루프 기능을 취소하기 위해 클로저를 사용하려면
을 사용해야 합니다.
$recursive = 함수 () 사용 (&$recursive){
// 이제 이 함수를 $recursive
로 사용할 수 있습니다.
}
이 양식입니다.
4. 지연 바인딩
사용 중인 변수 바인딩을 지연해야 하는 경우 참조를 사용해야 합니다. 그렇지 않으면 정의할 때 복사본이 만들어져 사용됩니다.
$결과 = 0;
$one = 함수()
{
var_dump($result);
};
$two = function() 사용 ($result)
{
var_dump($result);
};
$3 = function() 사용 (&$result)
{
var_dump($result);
};
$결과 ;
$one(); // NULL 출력: $result가 범위에 속하지 않습니다
$two(); // int(0) 출력: $result가 복사되었습니다
$3(); // int(1)을 출력합니다
참조를 사용하는지 여부는 해당 값이 호출 시 할당되는지 아니면 선언될 때 지정되는지를 나타냅니다.
이 기사가 여러분에게 몇 가지 팁을 줄 수 있기를 바라며, 마음에 드셨으면 좋겠습니다.