>  기사  >  백엔드 개발  >  PHP 클로저 함수()의 자세한 사용법()

PHP 클로저 함수()의 자세한 사용법()

步履不停
步履不停원래의
2019-06-24 17:15:542783검색

PHP 클로저 함수()의 자세한 사용법()

PHP의 클로저(Closure)도 익명기능입니다. PHP5.3에서 도입되었습니다.

클로저 구문은 매우 간단합니다. 주의해야 할 유일한 키워드는 클로저와 외부 변수를 연결하는 방법을 사용하는 것입니다.

}

1

2

3

[php] 일반 보기 복사[php] view plain copy

$a =function()use($b) { 

}

$a =함수()사용($b) {
🎜🎜🎜

클로저의 여러 기능:

1 foreach 루프의 코드 줄이기

{ < /code><td><p><code> $this->제품[$product] = $수량; [php] view plain copy

<?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; 

// 往购物车里添加条目 

} 🎜🎜 공개 code> 함수getQuantity($product) 🎜🎜 { 🎜🎜<code> 반환isset($this->제품[$product]) ? $this->제품[$product] : 🎜🎜 FALSE 🎜🎜 } 🎜🎜 code>공개함수getTotal($tax) 🎜🎜 <code>{ 🎜🎜 $total= 0.00; 🎜🎜 $콜백= 🎜🎜 함수($퀀티,$제품)사용($tax, &$total) 🎜🎜 { 🎜🎜 $pricePerItem= 상수(CLASS ."::PRICE_". 🎜🎜 >strtoupper($product)) 🎜🎜 $ 총액 += ($pricePerItem*$yangity) * ($tax+ 1.0) 🎜🎜 } 🎜🎜 array_walk($this->제품,$callback) <code> 코드>🎜🎜<code> 반환라운드($total, 2) ;; 🎜🎜 } 🎜🎜} 🎜🎜$my_cart= code><code>new장바구니 🎜🎜// 장바구니에 항목 추가 🎜

$my_cart->add('버터', 1) $my_cart->add('butter', 1); 

$my_cart->add('milk', 3); 

$my_cart->add('eggs', 6); 

// 打出出总价格,其中有 5% 的销售税. 

print $my_cart->getTotal(0.05) . "n"

// The result is 54.29 

?>

1

2

3

4

5

6

7

8

9

2 2

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

[php] 일반 보기 복사

<?php

< code>// 추가된 일부 품목과 각 품목의 수량을 포함한 기본 장바구니입니다.

// 장바구니에 담긴 모든 상품의 총 가격을 계산하는 데 사용되는 메소드가 있습니다. 이 메서드는 클로저를 콜백 함수로 사용합니다.

class 장바구니

{

const < code>PRICE_BUTTER = 1.00;

const PRICE_MILK = 3.00;

const PRICE_EGGS = 6.95;

보호됨 $products = 배열();

공개 함수 추가(&amp;amp;amp;amp;amp;lt;/ 코드><code>$제품,$수량)

这里如果我们改造getTotal函数必然要使用到foreach

2 减少函数的参数

1

2

3

4

5

6

7

8

9

[php] view plain copy

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 解除递归函数

$my_cart->add('계란', 6)

1

2

3

4

5

6

7

8

9

10

[php] view plain copy

<?php

$fib =function($n)use(&amp;amp;amp;amp;amp;$fib) {

if($n == 0 || $n == 1) return 1;

return $fib($n - 1) + $fib($n - 2);

};

echo $fib(2) . "n";// 2

$lie =$fib;

$fib =function(){die(&#39;error&#39;);};//rewrite $fib variable

echo $lie(5);// error because $fib is referenced by closure

$my_cart ->add('우유', 3)

// 판매세 5%를 포함한 총 가격을 인쇄하세요. /code>🎜🎜<code>인쇄 $my_cart->getTotal(0.05) "n" ; 🎜🎜// 결과는 54.29 🎜🎜?>🎜🎜🎜🎜🎜🎜 getTotal 함수를 변환하려면 여기서 사용해야 합니다. foreach🎜🎜2 함수 매개변수🎜
🎜1🎜🎜2🎜🎜3🎜🎜4🎜🎜5🎜🎜6🎜🎜7🎜🎜8 🎜 🎜9🎜🎜 🎜[php] 일반 보기 복사🎜🎜함수 html ( $code ,$id="",$class=""){ 🎜🎜if ( code ><code>$id !=="")$id = " id = "$id"" 🎜🎜$class = ( $class !=="")?" class ="$class"" :">"; 🎜🎜$open =" &lt ;$code$id$class"; 🎜🎜$close ="</$code> ; 🎜🎜return 함수 ($inner ="")사용 ($open ,$close){ 🎜🎜반환 "$open$inner$close";}; 🎜🎜}🎜🎜🎜🎜🎜🎜 일반적인 방법을 사용하면 내부를 html 함수 매개변수이므로 코드를 읽거나 사용하든 클로저를 사용하는 것이 좋습니다🎜🎜3 잠금 해제재귀 함수🎜
🎜1🎜🎜2🎜🎜3🎜🎜4🎜🎜5🎜🎜6🎜🎜7🎜🎜8🎜🎜9🎜🎜10🎜🎜 🎜[php] 일반 보기 복사🎜🎜<?php 🎜🎜 $fib 코드> =함수($n) 사용(&amp;amp;amp;amp;amp;$fib) { 🎜🎜 if($n == 0 || $n == 1) 반환 코드> <code>1; 🎜🎜 반환 $fib($n - 1) + $fib($n - 2 ); 코드>🎜🎜 } 🎜🎜 echo $fib 코드>( 2) . "n";// 2 🎜🎜 $lie =$fib 🎜🎜 $fib 코드> = 함수(){다이('오류' );};//$fib 변수 다시 쓰기 🎜🎜 echo $lie (5);// 클로저에서 $fib를 참조했기 때문에 오류가 발생했습니다.🎜🎜🎜🎜🎜

위 질문에서 사용은 &를 사용합니다. 여기서 &를 사용하지 않으면 오류 n-1)을 찾을 수 없습니다(fib 유형은 이전에 정의되지 않았습니다)

따라서 사용해야 합니다. 루프 기능을 취소하려면 클로저를 사용하세요. >

&lt ;?php $recursive=함수()use(&amp;amp;amp;amp;amp;$recursive){ 4 지연 바인딩 정보

// 이제 이 함수를 $recursive로 사용할 수 있습니다.

}

이 양식

사용 중인 변수 바인딩을 지연해야 하는 경우 참조를 사용해야 합니다. 그렇지 않으면 참조를 사용해야 합니다. 정의할 때 완료 복사본을 사용하세요[php] view plain copy

<?php 

$recursive =function ()use (&amp;amp;amp;amp;amp;$recursive){ 

// The function is now available as $recursive 

}

这样的形式

4 关于延迟绑定

如果你需要延迟绑定use里面的变量,你就需要使用引用,否则在定义的时候就会做一份拷贝放到use中

1

2

3

4

5

6

7

8

9

10

11

12

13

[php] view plain copy

<?php 

$result = 0; 

$one =function() 

{ var_dump($result); }; 

$two =function()use ($result

{ var_dump($result); }; 

$three =function()use (&amp;amp;amp;amp;amp;$result

{ var_dump($result); }; 

$result++; 

$one();   // outputs NULL: $result is not in scope 

$two();   // outputs int(0): $result was copied 

$three();   // outputs int(1)

1

2

3

4

5🎜🎜6🎜🎜7🎜🎜8🎜🎜9🎜🎜10🎜 🎜1 1🎜🎜12 🎜🎜13 🎜🎜🎜🎜[php] 일반 보기 복사🎜🎜<?php 🎜🎜$result = 0; 🎜🎜$one =함수() 🎜🎜{ var_dump($result) } 🎜🎜$two =함수<code>()사용 ($result) 🎜🎜 { var_dump($result) }; 🎜🎜$3 =함수 ()사용 (&amp;amp;amp;amp;amp;$result) 🎜🎜{ var_dump($result) } 🎜🎜$result++; /code> 🎜🎜<code>$one(); // NULL 출력: $result가 범위에 포함되지 않음 🎜🎜$two <code>(); // int(0) 출력: $result가 복사되었습니다. 🎜🎜$3() <code>//outputs int(1)🎜🎜🎜🎜🎜🎜참조를 사용하거나 사용하지 않는다는 것은 호출할 때 값을 할당하거나 선언할 때 값을 할당한다는 의미🎜🎜위는 PHP 모든 사람을 위해 작성한 클로저 function() use()의 자세한 사용법은 앞으로 모든 사람에게 도움이 되기를 바랍니다. 🎜🎜PHP 관련 기술 기사를 더 보려면 🎜PHP 튜토리얼🎜 칼럼을 방문하여 알아보세요! 🎜

위 내용은 PHP 클로저 함수()의 자세한 사용법()의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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