Home Backend Development PHP Tutorial PHP 5.3 closure syntax introduction function() use() {}_PHP tutorial

PHP 5.3 closure syntax introduction function() use() {}_PHP tutorial

Jul 13, 2016 pm 05:16 PM
function php use introduce function join in Anonymous grammar Closure

PHP 5.3 added closure syntax, also known as anonymous functions, allowing developers to declare inline functions and save them in variables. Although this syntax is a bit weird compared to JavaScript closures, it is a good addition to the PHP language

The code is as follows Copy code
/**
* The code mentioned below runs successfully in PHP5.3 or above.
*/
function callback($callback) {
$callback();
}
//Output: This is a anonymous function.
/n
//Here we directly define an anonymous function for transfer. In previous versions, this was not available.
//Now, this syntax is very comfortable and basically the same as JavaScript syntax. The reason why it is said to be basic is that you need to continue reading
//Conclusion: A comfortable grammar will definitely be popular.
callback(function() {
print "This is a anonymous function.
/n";
});
//Output: This is a closure use string value, msg is: Hello, everyone.
/n
//A closure is first defined here, this time there is a name on the household registration book...
//use, a fresh guy...
//As we all know, closure: the internal function uses the variables defined in the external function.
//In PHP's newly opened closure syntax, we use use to use variables defined outside the closure.
//Here we use the external variable $msg. After it is defined, its value is changed. After the closure is executed, the original value is output
//Conclusion: For basic type parameters passed by value, the value of the closure use is determined when the closure is created.
$msg = "Hello, everyone";
$callback = function () use ($msg) {
print "This is a closure use string value, msg is: $msg.
/n";
};
$msg = "Hello, everybody";
callback($callback);
//Output: This is a closure use string value lazy bind, msg is: Hello, everybody.
/n
//Change the reference method, we use the reference method to use
//You can find that the output this time is the value after the closure is defined...
//This is actually not difficult to understand. We use it by reference, and the closure uses the address of the $msg variable
//When the value at the address $msg is changed later, when the value of this address is output in the closure, it will naturally change.
$msg = "Hello, everyone";
$callback = function () use (&$msg) {
print "This is a closure use string value lazy bind, msg is: $msg.
/n";
};
$msg = "Hello, everybody";
callback($callback);
//Output: This is a closure use object, msg is: Hello, everyone.
/n
//The output in the closure is the previously copied object with the value Hello, everyone, followed by a reassignment of the name $obj.
//You can think about it this way
//1. obj is the name of the object Hello, everyone
//2. The object Hello, everyone is used by the closure, and the closure generates a reference to the Hello, everyone object
//3. obj is modified to the name of the Hello, everybody object
//4. Note that the entity represented by the name obj has changed, not the Hello, everyone object, so the output of the natural closure is still the previous Hello, everyone
$obj = (object) "Hello, everyone";
$callback = function () use ($obj) {
print "This is a closure use object, msg is: {$obj->scalar}.
/n";
};
$obj = (object) "Hello, everybody";
callback($callback);
//Output: This is a closure use object, msg is: Hello, everybody.
/n
//Let’s follow the steps above and proceed step by step:
//1. The obj name points to the Hello, everyone object
//2. The closure generates a reference pointing to the Hello, everyone object
//3. Modify the scalar value of the object pointed to by the obj name (i.e. Hello, everyone object)
//4. Execute the closure, and the output will naturally be Hello, everybody, because there is actually only one real object
$obj = (object) "Hello, everyone";
$callback = function () use ($obj) {
print "This is a closure use object, msg is: {$obj->scalar}.
/n";
};
$obj->scalar = "Hello, everybody";
callback($callback);
//Output: This is a closure use object lazy bind, msg is: Hello, everybody.
/n
//What does the closure refer to? &$obj, the reference generated by the closure points to the address pointed to by the name $obj.
//Therefore, no matter how obj changes, there is no escape....
//So, the output is the changed value
$obj = (object) "Hello, everyone";
$callback = function () use (&$obj) {
print "This is a closure use object lazy bind, msg is: {$obj->scalar}.
/n";
};
$obj = (object) "Hello, everybody";
callback($callback);
/**
* A counter generator using closures
* This is actually based on the example of closures introduced in python...
* We can think about it this way:
*     1. Each time the counter function is called, a local variable $counter is created, initialized to 1.
*       2. Then create a closure, which generates a reference to the local variable $counter.
* 3. The function counter returns the created closure and destroys the local variable, but at this time there is a reference to $counter from the closure,
* It will not be recycled, so we can understand it this way. The closure returned by the function counter carries a free
* Variables.
*    4. Since each call to counter creates an independent $counter and closure, the returned closures are independent of each other.
*     5. Execute the returned closure, increment the free state variable it carries and return it, and the result is a counter.
* Conclusion: This function can be used to generate independent counters.
*/
function counter() {
$counter = 1;
return function() use(&$counter) {return $counter ++;};
}
$counter1 = counter();
$counter2 = counter();
echo "counter1: " . $counter1() . "
/n";
echo "counter1: " . $counter1() . "
/n";
echo "counter1: " . $counter1() . "
/n";
echo "counter1: " . $counter1() . "
/n";
echo "counter2: " . $counter2() . "
/n";
echo "counter2: " . $counter2() . "
/n";
echo "counter2: " . $counter2() . "
/n";
echo "counter2: " . $counter2() . "
/n";
?>

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/628696.htmlTechArticlePHP 5.3 加入了闭包语法,也就是匿名函数,允许开发者申明行内函数和在变量中保存。虽然这个语法和JavaScript的闭包相比有点怪异,但是对...
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

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

7 PHP Functions I Regret I Didn't Know Before 7 PHP Functions I Regret I Didn't Know Before Nov 13, 2024 am 09:42 AM

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

PHP Program to Count Vowels in a String PHP Program to Count Vowels in a String Feb 07, 2025 pm 12:12 PM

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

How do you parse and process HTML/XML in PHP? How do you parse and process HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? Apr 03, 2025 am 12:03 AM

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

See all articles