php 의 폐쇄(Closure)익명 함수 상세 설명

php 의 클 로 저(Closure)는 익명 함수 로 PHP 5.3 에 도입 되 었 습 니 다.
패 킷 을 닫 는 문법 은 간단 합 니 다.주의해 야 할 키 워드 는 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 의 익명 함수,즉 폐쇄 함수 에 대해 새로운 인식 을 가지 게 되 었 습 니까?본 고 는 여러분 에 게 힌트 를 줄 수 있 기 를 바 랍 니 다.여러분 들 이 좋아 하 시 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기