28、PHP 原生魅力 - 函数 - 匿名函数

作者: 温新

图书: 【原生 PHP 魅力】

阅读: 192

时间: 2024-10-17 10:38:31

匿名函数

通常在 PHP 中为了重用代码和逻辑可以使用函数。一个经典的函数声明是这样的:

<?php

function sum(int $x, int $y): int {
    return $x + $y;
}

echo "Calling sum(5, 3) function: " . sum(5, 3)  . PHP_EOL;
echo "Calling sum(1, 2) function: " . sum(1, 2)  . PHP_EOL;

输出如下:

$ php 28-func.php
Calling sum(5, 3) function: 8
Calling sum(1, 2) function: 3

在这个使用 “传统函数声明方式” 的示例中,首先看到关键字 function,然后是函数名(这里是sum),接着是参数列表(这里为 x 和 y)。函数名是很关键的,因为在后续需要 “调用” 该函数时,必须使用这个名称(比如 sum(5,3))。

匿名函数是没有名字的函数。你可以这样声明:

<?php

// //定义匿名函数,并将其赋值给 $sum 变量
$sum = function (int $x, int $y): int {
    return $x + $y;
};

//通过变量 $sum 调用匿名函数
echo "调用匿名函数: " . $sum(5, 3) . PHP_EOL;
echo "调用匿名函数: " . $sum(1, 2) . PHP_EOL;

输出如下:

$ php 28-func.php
调用匿名函数: 8
调用匿名函数: 3

这个函数没有名字,但是它被赋给了一个变量,在这个例子中是 $sum。

可能你会觉得调用匿名函数的方式有点奇怪,它混合了使用变量 $sum 和定义参数 (5, 3) 的方式。

但为什么你需要匿名函数呢?或者更准确地说,何时需要使用匿名函数?

  • 生成第一个随机数(1 到 10 之间)
  • 生成第二个随机数(1 到 10 之间)
  • 对这两个数字应用某个函数。这个函数是你作为参数传递的,它会对这两个数字执行某种操作并返回一个结果。

在这种情况下,你可能需要使用匿名函数,因为它提供了灵活性。你可以根据需要动态地定义这个操作是什么,而不需要预先定义一个具体的、命名的函数。比如,你可以根据传入的不同匿名函数实现加法、减法、乘法或任何其他对这两个随机数的操作。这使得你的代码更加通用和可重用。

<?php

$sum = function (int $x, int $y): int {
    return $x + $y;
};

$mul = function (int $x, int $y): int {
    return $x * $y;
};

function apply(callable $func): int {
    $a = rand(1, 10);
    $b = rand(1, 10);

    return $func($a, $b);
}

echo "APPLY sum : " . apply($sum) . PHP_EOL;
echo "APPLY mul : " . apply($mul) . PHP_EOL;

输出如下:

$ php 28-func.php
APPLY sum : 10
APPLY mul : 35

$ php 28-func.php
APPLY sum : 5
APPLY mul : 6

如果你将 sum() 函数声明为匿名函数,你可以将其赋值给一个变量 $sum,并且可以将这个函数作为参数传递给 apply() 函数。

一个 PHP 核心函数的例子

一些 PHP 核心函数,需要一个函数作为参数。例如,array_map() 需要设置一个函数来应用于每个数组元素:

<?php

$a = array_map(function (int $item): int {
    return $item * 2;
}, [1,2,3,4,5]);

print_r($a);

输出如下:

$ php 28-func.php
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 10
)

在这种情况下,你可以进行重构,声明一个变量 $double,并将翻倍参数的函数赋值给它。

<?php

$a = [1,2,3,4,5];

$double = function (int $x): int {
    return $x * 2;
};

$b = array_map($double, $a);
print_r($b);

输出如下:

$ php 28-func.php
Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
    [4] => 10
)
请登录后再评论