Detailed explanation of closures in PHP (with detailed examples)

王林
Release: 2023-04-07 11:06:01
forward
3105 people have browsed it

Anonymous function

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. Declaring an anonymous function is like this:

$func = function() {

 }; //带结束符
Copy after login

As you can see, because the anonymous function has no name, if you want to use it, you need to return it to a variable. Anonymous functions can also declare parameters like ordinary functions, and the calling method is also the same:

$func = function( $param ) {
    echo $param;
};$func( 'some string' );
 //输出:
 //some string
Copy after login

By the way, before PHP introduced closures, there was also a function that could create anonymous functions: create function, but the code logic is only It can be written as a string, which looks obscure and difficult to maintain, so few people use it.

Implement closure

Pass anonymous functions as parameters in ordinary functions, and they can also be returned. This implements a simple closure.

//例一
//在函数里定义一个匿名函数,并且调用它
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;
} );
Copy after login

Keywords that connect closures and external variables: USE

function getMoney() {
    $rmb = 1;
    $dollar = 6;
    $func = function() use ( $rmb ) {
        echo $rmb;
        echo $dollar;
    };
    $func();
}getMoney();
//输出:
//1
//报错,找不到dorllar变量
Copy after login

Closures can save some variables and values ​​​​in the context of the code block in which they are located. 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:

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 issue during development.
Some people may wonder whether it is possible to change 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
Copy after login

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
Copy after login

Okay, so 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.

function getMoneyFunc() {
    $rmb = 1;
    $func = function() use ( &$rmb ) {
        echo $rmb;
        //把$rmb的值加1
        $rmb++;
    };
    return $func;
}$getMoney = getMoneyFunc();
$getMoney();
$getMoney();
$getMoney();
//输出:
//1
//2
//3
Copy after login

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, let alone js. Compared with 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.

For more related content, please visit the PHP Chinese website: PHP Video Tutorial

The above is the detailed content of Detailed explanation of closures in PHP (with detailed examples). For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:cnblogs.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template