魏长东

weichangdong

东邪

php 5.3新增的闭包语法介绍function() use()

function callback($callback) {    
    $callback();    
}        
callback(function() {    
    print "This is a anonymous function.<br />\n";    
});
//以上代码详解  
//输出: This is a anonymous function.<br />\n    
//这里是直接定义一个匿名函数进行传递, 在以往的版本中, 这是不可用的.    
//现在, 这种语法非常舒服, 和javascript语法基本一致, 之所以说基本呢, 需要继续向下看    
//结论: 一个舒服的语法必然会受欢迎的.

$msg = "Hello, old";    
$callback = function () use ($msg) {    
    print "This is a closure use string value, msg is: $msg. <br />";    
};    
$msg = "Hello, new";    
callback($callback); 
//以上代码详解  
//输出: This is a closure use string value, msg is: Hello, old.    
//这里首先定义了一个闭包, 这次户口本上有名字了...    
//use, 一个新鲜的家伙...    
//众所周知, 闭包: 内部函数使用了外部函数中定义的变量.    
//在PHP新开放的闭包语法中, 我们就是用use来使用闭包外部定义的变量的.    
//这里我们使用了外部变量$msg, 定义完之后, 又对其值进行了改变, 闭包被执行后输出的是原始值    
//结论: 以传值方式传递的基础类型参数, 闭包use的值在闭包创建是就确定了.  
$msg = "Hello, old";    
$callback = function () use (&$msg) {    
    print "This is a closure use string value lazy bind, msg is: $msg. <br />\n";    
};    
$msg = "Hello, new";    
callback($callback);    
//输出: This is a closure use string value lazy bind, msg is: Hello, new.   
//换一种引用方式, 我们使用引用的方式来use    
//可以发现这次输出是闭包定义后的值...    
//这个其实不难理解, 我们以引用方式use, 那闭包use的是$msg这个变量的地址    
//当后面对$msg这个地址上的值进行了改变之后, 闭包内再输出这个地址的值时, 自然改变了.