Home > Backend Development > PHP Problem > What is the function of php closure

What is the function of php closure

王林
Release: 2023-02-23 14:56:01
forward
5604 people have browsed it

What is the function of php closure

php closures are different from closures in js. This article will explain php closures for your reference.

Speaking of closures, we have to mention anonymous functions. PHP closures are mainly implemented by anonymous functions.

Anonymous function

Declaration:

1 $func = function() {
2  
3 }; //带结束符
Copy after login

As you can see, 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:

1 $func = function( $param ) {
2     echo $param;
3 };$func( 'some string' );
4 //输出:
5 //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.

Example:

//例一
//在函数里定义一个匿名函数,并且调用它
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 connecting 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 use refers to only 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
The characteristics of PHP closures are not too surprising. In fact, similar or even 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.

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

The above is the detailed content of What is the function of php closure. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:csdn.net
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