关于PHP闭包和回调的思考

闭包

闭包函数也叫匿名函数,简单地说就是没有名称的函数,经常作为回调函数的参数。

简单应用

<?php
	$test = function($a){
		echo pow(2,$a);
	};
	$test(3); //print -- 8

use关键字

use关键字在闭包函数中的角色是让闭包函数使用非传参的变量,即让闭包函数有能力捕获外界变量。

<?php
	$b = 3;
	$test = function($a) use($b){
		echo $a+$b;
	};
	$test(4); //print -- 7

注意: 闭包内所引用的变量不能被外部所访问(即,内部对变量的修改,外部不受影响),若想要在闭包内对变量的改变从而影响到上下文变量的值,需要使用&的引用传参。

<?php
	$b = 3;
	$test = function() use(&$b){
		$b=9;
	};
	echo $b; //print -- 9

PHP的闭包类(Closure)

其实在PHP中定义一个闭包函数其实就是一个Closure类的实例;

<?php
	
	$test = function($a) {
		echo $a;
	};
	var_dump($test);
	/*print --
	object(Closure)#2 (1) {
  		["parameter"]=>
  			array(1) {
    			["$a"]=>
    			string(10) "<required>"
  			}
	}*/

另外,Closure可以将其他类的实例绑定到Closure的实例中,进而操作其他类的私有变量等。

<?php
class Test
{
	private $a = 1;
}
$test = new Test();
var_dump($test);
/*print --
object(Test)#2 (1) {
  ["a":"Test":private] => int(1)
}
*/
$func=Closure::bind(function () use ($test) {
    $test->a = 8;

}, $test, test::class);
var_dump($func);
/*print --
object(Closure)#5 (2) {
  ["static"]=>
  array(1) {
    ["test"]=>
    object(Test)#2 (1) {
      ["a":"Test":private]=>
      int(1)
    }
  }
}
*/
call_user_func($func);//执行闭包函数$func
var_dump($test);
//** 可以看到私有变量a的值被修改,1->8 **
/*print --
object(Test)#2 (1) {
  ["a":"Test":private]=>
  int(8)
}
*/

回调

回调函数其实就是将一个函数作为另一个函数的参数,这样在一些场景下可以达到一些特定作用,其实回调在异步(js)中特别有用,用于捕获异步结果。
PHP自带很多回调函数:

call_user_func()call_user_func_array()//一些数组函数
array_reduce();
array_walk();

我们也可以自己写回调函数,这样的形式在js中用的多,php并不多:

<?php
function a($a)
{
	if($a>100){
		return true;
	}
	return false;
}

function test($a,$b)
{
	if($a($b)){
		echo $b;
	}else{
		echo 50;
	}
}
test('a',500);//print -- 500
test('a',20);//print -- 50

参考

php Closure官方文档

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章