PHP 匿名函数以及闭包

  • 匿名函数也叫闭包函数(closures),声明方式如下
<?php
$func = function() {
};

// 匿名函数因为没有名字,所以需要将其赋值给一个变量返回
// 匿名函数也可以声明参数
$func = function($param) {
	echo $param;
};
$func('Hello world');
// 输出 Hello world
  • 简单的闭包:匿名函数作为参数传入普通函数,也可以被返回。
<?php
// 实例 1 :在函数里定义一个匿名函数,并且调用它
function printStr(){
	$func = function($str){
		echo $str;
	};
	$func('Hello world!');
}
// 调用
printStr();
// 输出 Hello world!

// 实例 2 :在函数里把匿名函数返回,并且调用它
function getFunc(){
	$func = function($str){
		echo $str;
	};
	return $func;
}
// 调用
$printFunc = getFunc();
$printFunc('Hello world!!'); 
// 输出 Hello world!!

// 实例 3 :在函数里把匿名函数当做参数传递,并且调用它
function callFunc($func) {
    $func('Hello world!!!');
}
// 调用
callFunc(function($str) {
    echo $str;
});
// 输出 Hello world!!!
  • 连接闭包和外界变量的关键字:use
<?php
// 实例 1 :不用 use 关键字
function getFriends(){
	$f1 = 'Jerry';
	$f2 = 'Penny';
	$func = function(){
		echo 'Hello world!!!!' . PHP_EOL;
		echo $f1 . PHP_EOL;
		echo $f2 . PHP_EOL;
	};
	$func();
}
// 调用:
getFriends();
// 输出 Hello world!!!!

// 实例 2 :use 声明变量 $f1
function getFriends(){
	$f1 = 'Jerry';
	$f2 = 'Penny';
	$func = function() use ($f1){
		echo 'Hello world!!!!' . PHP_EOL;
		echo $f1 . PHP_EOL;
		echo $f2 . PHP_EOL;
	};
	$func();
}
// 调用:
getFriends();
// 输出:
Hello world!!!!
Jerry

// 实例 3:use 声明变量 $f1 和 $f2
function getFriends(){
	$f1 = 'Jerry';
	$f2 = 'Penny';
	$func = function() use ($f1, $f2){
		echo 'Hello world!!!!' . PHP_EOL;
		echo $f1 . PHP_EOL;
		echo $f2 . PHP_EOL;
	};
	$func();
}
// 调用:
getFriends();
// 输出:
Hello world!!!!
Jerry
Penny

// 总结 1:
// 匿名函数不能调用所在代码块的上下文变量,而需要通过使用 use 关键字
// 闭包可以保存所在代码块上下文的一些变量和值。
// 实例 2 中,$f2 没有在 use 关键字中声明,匿名函数就不能获取到 $f2

// 实例 4:
function getFriends(){
	$f1 = 'Jerry';
	$func = function() use ($f1){
		$f1 = 'Stark';
		echo $f1 . PHP_EOL;
		$f1 = 'Luffy';
	};
	$func();
	echo $f1;
}
// 调用:
getFriends();
// 输出:
Stark
Jerry

// 总结 2:
// 在匿名函数内改变上下文的变量,只在匿名函数内生效,在匿名函数外无效
// use 引用的是变量的一个副本

// 实例 5:use 中声明的变量前加“&”,就可以完全引用变量
function getFriends(){
	$f1 = 'Jerry';
	$func = function() use (&$f1){
		$f1 = 'Stark';
		echo $f1 . PHP_EOL;
		$f1 = 'Luffy';
	};
	$func();
	echo $f1;
}
// 调用:
getFriends();
// 输出:
Stark
Luffy

// 实例 6:
function getFriends(){
	$f1 = 'Jerry';
	$func = function() use (&$f1){
		echo $f1 . PHP_EOL;
		$f1 = 'Luffy';
	};
	return $func;
}
// 调用:
$gf = getFriends();
$gf();
$gf();
// 输出:
Jerry
Luffy
发布了119 篇原创文章 · 获赞 12 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/hualaoshuan/article/details/100829006
今日推荐