PHP8的匿名函数-PHP8知识详解

php 8引入了匿名函数(Anonymous Functions),它是一种创建短生命周期的函数,不需要命名,并且可以在其作用域内直接使用。以下是在PHP 8中使用匿名函数的知识要点:

1、创建匿名函数,语法格式如下:

复制代码
$fn = function() {  
    // 匿名函数的代码  
};

使用function关键字创建一个匿名函数。下面是一个示例:

复制代码
<?php
$fn = function($arg1, $arg2) {  
    // 匿名函数的代码  
    return $arg1 + $arg2; 
};
echo $fn(3, 4);
?>

以上代码在PHP8中输出的结果为:

复制代码
7

在上述示例中,我们向匿名函数传递了值 arg1 = 3 和 arg2 = 4,并输出结果为 7。请根据您的需求修改参数的值。

2、匿名函数可以作为变量赋值给其他变量,也可以作为参数传递给其他函数或方法。示例代码:

复制代码
<?php
// 将匿名函数赋值给变量
$myFunction = function($arg1, $arg2) {
    // 匿名函数的代码
    return $arg1 + $arg2;
};

// 使用变量中的匿名函数进行计算
$result = $myFunction(3, 4);
echo $result; // 输出 7
echo "<br>";

// 将匿名函数作为参数传递给其他函数或方法
function operate($a, $b, $func) {
    return $func($a, $b);
}

$result = operate(5, 2, function($x, $y) {
    return $x * $y;
});

echo $result; // 输出 10

?>

在PHP8中运行的结果为:

复制代码
7
10

在上面的示例中,我们首先将匿名函数赋值给变量 $myFunction,然后使用该变量调用匿名函数并将结果存储$result 变量中。

接下来,我们定义了一个 operate() 函数,它接受三个参数:两个操作数 $a$b,以及一个匿名函数 $func。在 operate() 函数内部,我们通过调用 $func($a, $b) 来执行传递进来的匿名函数,并返回其结果。

最后,我们使用了另一个匿名函数作为参数传递给 operate() 函数,并对数字进行相乘操作,将结果输出。

3、匿名函数可以访问其作用域内的变量,这些变量被称为闭包变量(Closure Variables)。在匿名函数内部,可以使用use关键字来引用外部变量。

复制代码
<?php
$variable = 'php';  
$fn = function() use ($variable) {  
    echo $variable;  
};  
$fn(); 
?>

以上代码在PHP8中,输出的结果为:

复制代码
php

4、匿名函数也可以返回值,就像普通函数一样。可以在匿名函数内部使用return语句来返回值。示范代码:

复制代码
<?php
$fn = function() {  
    return 'php';  
};  
echo $fn(); 
?>

以上代码在PHP8中的运行结果为:

复制代码
php

5、匿名函数可以作为回调函数使用,例如在数组排序、异步操作等场景中。可以使用callable类型来指定匿名函数作为回调函数。示范代码:

复制代码
<?php
$numbers = [4, 2, 8, 6, 1];

// 使用匿名函数进行数组排序
usort($numbers, function ($a, $b) {
    return $a - $b;
});

print_r($numbers);
?>

在PHP8中运行的结果为:

复制代码
Array ( [0] => 1 [1] => 2 [2] => 4 [3] => 6 [4] => 8 )

在这个例子中,我们使用了usort函数对numbers数组进行排序。第二个参数是一个匿名函数,它接受两个参数a和$b,并返回一个整数值来指定元素之间的比较关系。通过使用匿名函数作为回调函数,我们可以根据自己的逻辑来定义排序规则。

请注意,在使用匿名函数作为回调函数时,可以直接将匿名函数写在函数调用的参数列表中,而不需要定义一个独立的函数体。这样可以使代码更加简洁和易读。

6、匿名函数也可以使用闭包绑定(Closure Binding),即将匿名函数绑定到特定的对象或类。通过使用bind方法,可以将匿名函数绑定到特定的对象上。

示范代码:

复制代码
<?php
class MyClass {
    private $message = "Hello";

    public function sayHello() {
        $func = function() {
            echo $this->message;
        };

        $boundFunc = $func->bindTo($this, 'MyClass');
        $boundFunc();
    }
}

$obj = new MyClass();
$obj->sayHello();
?>

以上代码在PHP8中运行结果为':

复制代码
Hello

在上述示例中,我们创建了一个名为MyClass的类,该类具有一个私有属性message和一个公共方法sayHello。

在sayHello方法内部,我们定义了一个匿名函数func,它尝试访问this->message。然后,我们使用bindTo方法将匿名函数绑定到当前对象$this上,并指定绑定到MyClass类。

最后,我们调用绑定后的函数boundFunc(),这样就可以在匿名函数中成功访问到this->message的值。

请注意,这里的关键是使用bindTo方法将匿名函数与特定的对象或类进行绑定。这样做的好处是,匿名函数仍然保持其原始定义中访问外部作用域变量的能力,同时又能够正确地访问绑定的对象或类的成员。

7、匿名函数还可以使用闭包模拟(Closure Simulation),即创建一个模拟闭包来访问外部变量。这在使用旧版本的PHP时非常有用,因为匿名函数在旧版本中不可用。通过使用命名函数和命名函数的变量绑定,可以模拟闭包的行为。示范代码:

复制代码
<?php
function createClosure($outerVariable) {
    return function() use ($outerVariable) {
        echo "Outer variable value: " . $outerVariable;
    };
}

// 创建一个模拟闭包
$closure = createClosure("Hello, world!");

// 执行闭包
$closure(); 
?>

在php8zhon运行的结果为:

复制代码
Outer variable value: Hello, world!

8、静态匿名函数

匿名函数允许被定义为静态化。这样可以防止当前类自动绑定到它们身上,对象在运行时也可能不会被绑定到它们上面。示范代码:

复制代码
<?php
class MyClass {
   private static $message = 'Hello';

   public function testCallback() {
      $callback = static fn() => self::$message;
      echo $callback(); // 输出:Hello
   }
}

$obj = new MyClass();
$obj->testCallback();
?>

在上面的代码中,我们将匿名函数定义为静态化,并通过static fn() => self::message创建了一个闭包。该闭包能够访问类内部的私有[静态变量](https://www.phpfw.com/tag/jingtaibianliang/ "静态变量")message。在testCallback()方法中,我们调用了该闭包,并输出了结果。

请注意,由于我们使用了静态化的匿名函数,所以无需依赖于对象进行绑定,但仍然可以访问类的成员变量。

相关推荐
JaguarJack17 小时前
FrankenPHP 原生支持 Windows 了
后端·php·服务端
BingoGo17 小时前
FrankenPHP 原生支持 Windows 了
后端·php
JaguarJack2 天前
PHP 的异步编程 该怎么选择
后端·php·服务端
BingoGo2 天前
PHP 的异步编程 该怎么选择
后端·php
JaguarJack2 天前
为什么 PHP 闭包要加 static?
后端·php·服务端
ServBay3 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954483 天前
CTF 伪协议
php
BingoGo6 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack6 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo7 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php