Home > Article > Backend Development > A preliminary study on PHP's closure (Closure) anonymous function_php skills
When it comes to closures, we have to think of anonymous functions, also called closure functions (closures). It seems that PHP closure implementation mainly relies on it. Declare an anonymous function like this:
$func = function() { }; //带结束符 可以看到,匿名函数因为没有名字,如果要使用它,需要将其返回给一个变量。匿名函数也像普通函数一样可以声明参数,调用方法也相同: $func = function( $param ) { echo $param; }; $func( 'some string' ); //输出: //some string
By the way, before PHP introduced closures, there was also a function that could create anonymous functions: create function. However, the code logic could only be written as a string, which looked very obscure and difficult to maintain, so few people used it. .
1. Implement closure
Passing anonymous functions as parameters in ordinary functions can also be returned. This implements a simple closure.
There are three examples below
//例一 //在函数里定义一个匿名函数,并且调用它 function printStr() { $func = function( $str ) { echo $str; }; $func( 'some string' ); } printStr(); //例二 //在函数中把匿名函数返回,并且调用它 function getPrintStrFunc() { $func = function( $str ) { echo $str; }; return $func; } $printStrFunc = getPrintStrFunc(); $printStrFunc( 'some string' ); //例三 //把匿名函数当做参数传递,并且调用它 function callFunc( $func ) { $func( 'some string' ); } $printStrFunc = function( $str ) { echo $str; }; callFunc( $printStrFunc ); //也可以直接将匿名函数进行传递。如果你了解js,这种写法可能会很熟悉 callFunc( function( $str ) { echo $str; } );
2. Keyword to connect closure and external variables: USE
Closures can save some variables and values in the context of the code block. By default in PHP, anonymous functions cannot call context variables in the code block where they are located, but need to use the use keyword.
Let’s look at another example:
function getMoney() { $rmb = 1; $dollar = 6; $func = function() use ( $rmb ) { echo $rmb; echo $dollar; }; $func(); } getMoney(); //输出: //1 //报错,找不到dorllar变量
As you can see, dollar is not declared in the use keyword, and it cannot be obtained in this anonymous function, so pay attention to this issue during development.
Some people may wonder whether it is possible to change the context variables in an anonymous function, but I found that it is not possible:
function getMoney() { $rmb = 1; $func = function() use ( $rmb ) { echo $rmb; //把$rmb的值加1 $rmb++; }; $func(); echo $rmb; } getMoney(); //输出: //1 //1
Ah, it turns out that what use refers to is just a copy of the variable. But I want a full reference to the variable, not a copy.
To achieve this effect, just add an & symbol before the variable:
function getMoney() { $rmb = 1; $func = function() use ( &$rmb ) { echo $rmb; //把$rmb的值加1 $rmb++; }; $func(); echo $rmb; } getMoney(); //输出: //1 //2
Okay, so the anonymous function can reference the context variables. If the anonymous function is returned to the outside world, the anonymous function will save the variables referenced by use, but the outside world will not be able to obtain these variables. In this way, the concept of 'closure' may be clearer.
Change the above example according to the description:
function getMoneyFunc() { $rmb = 1; $func = function() use ( &$rmb ) { echo $rmb; //把$rmb的值加1 $rmb++; }; return $func; } $getMoney = getMoneyFunc(); $getMoney(); $getMoney(); $getMoney(); //输出: //1 //2 //3
Summary
There are no big surprises in the features of PHP closures. In fact, similar or even much more powerful functions can be achieved by using CLASS, which cannot be compared with JS closures. We can only look forward to improvements in PHP's closure support in the future. However, anonymous functions are still quite useful. For example, when using functions such as preg_replace_callback, you don't need to declare a callback function externally.
Have you guys gained a new understanding of PHP’s anonymous functions, which are closure functions? I hope this article can give you some tips and I hope you like it.