This article mainly introduces to you the PHPanonymous function introduced in php5.3, that is, closure (Closure), and the role of closure. It is very detailed. It is recommended here to friends in need. them.
When we mention closures, we have to think of anonymous functions, also called closure functions (closures). It seems that PHP closure implementation mainly relies on it. Declaring an anonymous function is 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 can create anonymous functions: create function, but the code logic can only be written as String, which looks obscure and difficult to maintain, so few people use it.
1. Implement closure
Pass anonymous functions as parameters in ordinary functions, and they 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. Keywords connecting closures and external variables: USE
Closures can save some variables in the context of the code block they are in. and value. 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 take a 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 you should pay attention to this during development. question.
Some people may wonder whether context variables can be changed in anonymous functions, 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 use refers to It's 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 that the anonymous function can reference the context variable. 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 is not much surprise about the characteristics of PHP closures. In fact, similar or even more powerful functions can be achieved by using CLASS. It 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 the callback function externally.
The above is the detailed content of Detailed explanation of closure and anonymous function declaration examples in PHP. For more information, please follow other related articles on the PHP Chinese website!