PHP中的函数编程

PHP支持第一类函数,这意味着可以将函数赋值给变量。用户定义的函数和内置函数都可以由变量引用并动态调用。函数可以作为参数传递给其他函数,函数可以返回其他函数(称为高阶函数的函数)。

语言支持递归(一种允许函数调用自身的功能),但大多数PHP代码都集中在迭代上。

自PHP 5.3(2009)以来,已存在匿名函数(支持闭包)。

PHP 5.4增加了将闭包绑定到对象范围的能力,并且还改进了对可调用对象的支持,使得它们几乎在所有情况下都可以与匿名函数互换使用。

高阶函数的最常见用法是在实现策略模式时。内置array_filter() 函数要求输入数组(数据)和用作每个数组项的过滤函数的函数(策略或回调)。

<?php
$input = array(1, 2, 3, 4, 5, 6);

// Creates a new anonymous function and assigns it to a variable
$filter_even = function($item) {
return ($item % 2) == 0;
};

// Built-in array_filter accepts both the data and the function
$output = array_filter($input, $filter_even);

// The function doesn't need to be assigned to a variable. This is valid too:
$output = array_filter($input, function($item) {
return ($item % 2) == 0;
});

print_r($output);

闭包是一个匿名函数,可以访问从外部作用域导入的变量,而无需使用任何全局变量。从理论上讲,闭包是一个函数,在定义时,环境会关闭(例如固定)一些参数。闭包可以以干净的方式解决变量范围限制。

在下一个示例中,我们使用闭包来定义一个函数,该函数array_filter()从一系列过滤函数中返回单个过滤函数。

<?php
/**
* Creates an anonymous filter function accepting items > $min
*
* Returns a single filter out of a family of "greater than n" filters
*/
function criteria_greater_than($min)
{
return function($item) use ($min) {
    return $item > $min;
};
}

$input = array(1, 2, 3, 4, 5, 6);

// Use array_filter on a input with a selected filter function
$output = array_filter($input, criteria_greater_than(3));

print_r($output); // items > 3

系列中的每个滤波器功能仅接受大于某个最小值的元素。返回的单个过滤器 criteria_greater_than是一个闭包,其$min参数由作用域中的值关闭(在调用时作为参数给出 criteria_greater_than)。

默认情况下,使用早期绑定将$min变量导入到创建的函数中。对于具有后期绑定的真实闭包,应在导入时使用引用。想象一个模板或输入验证库,其中定义闭包以捕获范围中的变量,并在以后评估匿名函数时访问它们。

原文