php 의 폐쇄(Closure)익명 함수 상세 설명
패 킷 을 닫 는 문법 은 간단 합 니 다.주의해 야 할 키 워드 는 use 뿐 입 니 다.use 는 패 킷 과 외부 변 수 를 연결 합 니 다.
$a = function() use($b) {}
간단 한 예 는 다음 과 같다.
function callback($fun) {
$fun();
}
$msg = "Hello, everyone";
$fun = function () use($msg) {
print "This is a closure use string value, msg is: $msg. <br />/n";
};
$msg = "Hello, everybody";
callback($fun);
결 과 는:This is a closure use string value,msg is:Hello,everyone./n
PHP 에서 새로 개 방 된 패 킷 문법 에 서 는 패 킷 외부 에서 정 의 된 변 수 를 use 로 사용 합 니 다.여기 서 우 리 는 외부 변수$msg 를 사 용 했 습 니 다.정 의 를 마 친 후에 그 값 을 바 꾸 었 습 니 다.패키지 가 실 행 된 후에 출력 한 것 은 원본 값 입 니 다.전송 방식 으로 전달 되 는 기본 형식 매개 변 수 는 패 킷 use 의 값 이 패 킷 생 성에 서 확 정 됩 니 다.
작은 응용 프로그램 은 다음 과 같 습 니 다:
/**
*
* python ...
* :
* 1. counter , $counter, 1.
* 2. , $counter .
* 3. counter , , $counter ,
* , , , counter ,
* .
* 4. counter $counter , .
* 5. , , .
* : .
*/
function counter() {
$counter = 1;
return function() use(&$counter) {return $counter ++;};
}
$counter1 = counter();
$counter2 = counter();
echo "counter1: " . $counter1() . "<br />/n";
echo "counter1: " . $counter1() . "<br />/n";
echo "counter1: " . $counter1() . "<br />/n";
echo "counter1: " . $counter1() . "<br />/n";
echo "counter2: " . $counter2() . "<br />/n";
echo "counter2: " . $counter2() . "<br />/n";
echo "counter2: " . $counter2() . "<br />/n";
echo "counter2: " . $counter2() . "<br />/n";
?>
폐쇄 적 역할1.foreach 의 순환 코드 감소
예 를 들 어 수첩http://php.net/manual/en/functions.anonymous.php중의 예 Cart
<?php
// , 。
// 。 closure 。
class Cart
{
const PRICE_BUTTER = 1.00;
const PRICE_MILK = 3.00;
const PRICE_EGGS = 6.95;
protected $products = array();
public function add($product, $quantity)
{
$this->products[$product] = $quantity;
}
public function getQuantity($product)
{
return isset($this->products[$product]) ? $this->products[$product] :
FALSE;
}
public function getTotal($tax)
{
$total = 0.00;
$callback =
function ($quantity, $product) use ($tax, &$total)
{
$pricePerItem = constant(__CLASS__ . "::PRICE_" .
strtoupper($product));
$total += ($pricePerItem * $quantity) * ($tax + 1.0);
};
//
array_walk($this->products, $callback);
return round($total, 2);;
}
}
$my_cart = new Cart;
//
$my_cart->add('butter', 1);
$my_cart->add('milk', 3);
$my_cart->add('eggs', 6);
// , 5% .
print $my_cart->getTotal(0.05) . "
";
// The result is 54.29
?>
여기 서 getTotal 함 수 를 개조 하면 반드시 foreach 에 사용 해 야 합 니 다.2.함수 의 인자 감소
function html($code , $id="", $class=""){
if ($id !== "") $id = " id = \"$id\"" ;
$class = ($class !== "")? " class =\"$class\">":">";
$open = "<$code$id$class";
$close = "</$code>";
return function ($inner = "") use ($open, $close){
return "$open$inner$close";
};
}
만약 에 일반적인 방법 을 사용한다 면 우 리 는 inner 를 html 함수 매개 변수 에 넣 을 것 이다.그러면 코드 를 읽 든 사용 하 든 닫 는 것 보다 못 하 다.3.귀속 함수 해제
<?php
$fib = function($n) use(&$fib) {
if($n == 0 || $n == 1) return 1;
return $fib($n - 1) + $fib($n - 2);
};
echo $fib(2) . "
"; // 2
$lie = $fib;
$fib = function(){die('error');};//rewrite $fib variable
echo $lie(5); // error because $fib is referenced by closure
위의 문제 에서 use 가&를 사 용 했 음 을 주의 하 십시오.여 기 는 사용 하지 않 습 니 다&오류 가 발생 할 수 있 습 니 다 fib(n-1)는 function 을 찾 을 수 없습니다(앞에서 fib 의 유형 을 정의 하지 않 았 습 니 다)그래서 패키지 로 순환 함 수 를 해제 하려 면 사용 해 야 합 니 다.
<?php
$recursive = function () use (&$recursive){
// The function is now available as $recursive
}
이런 식 으로.4.귀속 지연
바 인 딩 use 의 변 수 를 지연 시 키 려 면 인용 을 사용 해 야 합 니 다.그렇지 않 으 면 정의 할 때 복사 해서 use 에 넣 을 것 입 니 다.
<?php
$result = 0;
$one = function()
{
var_dump($result);
};
$two = function() use ($result)
{
var_dump($result);
};
$three = function() use (&$result)
{
var_dump($result);
};
$result++;
$one(); // outputs NULL: $result is not in scope
$two(); // outputs int(0): $result was copied
$three(); // outputs int(1)
인용 을 사용 하고 인용 을 사용 하지 않 는 것 은 호출 할 때 값 을 부여 하 는 지,아니면 설명 할 때 값 을 부여 하 는 지 를 나타 낸다.젊은이 들 은 PHP 의 익명 함수,즉 폐쇄 함수 에 대해 새로운 인식 을 가지 게 되 었 습 니까?본 고 는 여러분 에 게 힌트 를 줄 수 있 기 를 바 랍 니 다.여러분 들 이 좋아 하 시 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.