PHP闭包Closure(匿名函数)

2014-05-20


闭包在php 5.3.0之后才被引入。

php的闭包是通过匿名函数实现的。

申明一个没有指定名称的函数即可实现闭包。

闭包基本用法

要使用闭包,需要将其赋值给变量才能使用闭包。

<?php
$greet = function($name)
{
    printf("Hello %s\r\n", $name);
};
$greet("World");  //输出 Hello World
$greet("PHP");  //输出Hello PHP
?>

闭包作用域

1.默认情况下,闭包无法使用所在代码块的上下文变量和值,如果要使用,需要使用关键字use进行申明。

2.默认情况下,无法在闭包内改变上下变量的值,因为通过use申明,只不过是将上下文变量复制了一个副本放在use中,所以无法修改。

3.如果要在闭包内改变上文变量的值,需要显式的在use中引用上下文变量。

<?php
$test = 1;
$unrefer = function() use($test) 
{
    $test;
    var_dump($test);
    $test++; 
};
$unrefer();  //输出 1 
var_dump($test);  //输出 1: 未引用
$refer = function() use(&$test) 
{
    $test;
    var_dump($test);
    $test++; 
};
$refer();  //输出 1 
var_dump($test);  //输出 2: 引用
?>

4.就算使用use引用了上下文变量,但是闭包还是会把use引用的变量保存限制在闭包内,外界是无法得到,需要赋值给变量才能得到。

function getMoneyFunc()
{
    $rmb = 1;
    $func = function() use ( &$rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    return $func;
}
$getMoney = getMoneyFunc();
$getMoney();  //输出 1
$getMoney();  //输出 2
$getMoney();  //输出 3

5.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();  //输出 null: Undefined variable(不在作用域内)
$two();  //输出 0: 未引用,在申明闭包时赋值
$three();  //输出 1:引用后,在调用闭包时赋值
?>


blog comments powered by Disqus