PHP –匿名函数和闭包(第一部分)

匿名函数是未绑定专有名称而定义的函数。通常,匿名功能仅会有限次数地用于特定目的。您可以根据需要将它们视为“抛弃式”功能。

让我们考虑以下示例,该示例说明了用作回调的标准函数:

function percentVowels_callback($word) {
$word = strtolower($word);
$chars = count_chars($word);
$numVowels = 0;
foreach (array("a", "e", "i", "o", "u") as $vowel) {
$numVowels += $chars[ord($vowel)];
}
return $numVowels / strlen($word);
}

$animals = array("dog", "cat", "birs", "ape",S"urchin");
$percentVowels = array_map("percentVowels_callback", $animals);

array_map()函数接受一个函数的名称和一个数组,并通过将回调函数应用于输入数组的每个元素而产生一个新的数组。

我定义的回调函数接受一个字符串,并返回由元音组成的百分比。

由于该array_map()语句仅使用该函数一次,因此可以将其重构percentVowels_callback()为匿名函数。通常,功能的目的是消除重复的代码并构建可重用的组件……但是匿名功能的目的是不同的。匿名函数将一组相关的语句组合在一起。

PHP的早期版本(从4.0.1版开始)对使用定义匿名函数提供了有限的支持create_function()。这是一个示例,显示了使用this重构为匿名函数的对array_map()with的调用。percentVowels_callback()create_function()

$percentVowels_callback = create_function('$word', '
$word = strtolower($word);
$chars = count_chars($word);
$numVowels = 0;
foreach (array("a", "e", "i", "o", "u") as $vowel) {
$numVowels += $chars[ord($vowel)];
}
return $numVowels / strlen($word);');

$percentVowels = array_map($percentVowels_callback, $animals);

根据您的喜好和编码样式,也可以内联定义回调。

根据应用程序的组织方式,您可能需要跳转到代码文件的不同部分或一起跳转到其他文件,以在遍历代码时检查函数的内容,然后找到返回的路径。呼叫位置。该功能的主体在最相关的位置可以通过视觉获得。

$percentVowels = array_map(create_function('$word', '
$word = strtolower($word);
$chars = count_chars($word);
$numVowels = 0;
foreach (array("a", "e", "i", "o", "u") as $vowel) {
$numVowels += $chars[ord($vowel)];
}
return $numVowels / strlen($word);'), $animals);

create_function()函数接受两个字符串-第一个列出用作匿名函数的参数的变量名,第二个包含该函数主体的代码-并返回可用于标识该函数的唯一字符串。

create_function()确实有一些缺点。因为参数列表和函数体是作为字符串提供的,所以必须小心确保字符串中的某些字符正确地转义。如果您的字符串用单引号引起来,则需要转义出现的所有单引号,或者如果您的字符串用双引号引起来,则需要转义双引号和美元符号。而且,您还会失去突出显示IDE可能提供的任何语法的好处,因为它会突出显示字符串以及字符串。总体而言,该方法麻烦且笨重。

从5.3版开始,PHP将为匿名函数提供更好的支持,并提供一种支持闭包的新语法。匿名函数的新语法更类似于JavaScript和其他事件驱动语言定义它们的方式。

$percentVowels_callback = function($word) {
$word = strtolower($word);
$chars = count_chars($word);
$numVowels = 0;
foreach (array("a", "e", "i", "o", "u") as $vowel) {
$numVowels += $chars[ord($vowel)];
}
return $numVowels / strlen($word);
};

$percentVowels = array_map($percentVowels_callback, $animals);

的笨拙create_function()及其字符串参数已一去不复返了。匿名函数的参数和主体作为PHP代码提供,可以由您的IDE正确突出显示。
新语法的一个警告是,函数的右括号后面必须有一个分号,因为$percentVowels_callback =某个值是一个常规赋值语句。

也可以使用新的内联语法来定义匿名函数。

$percentVowels = array_map(function ($word) {
$word = strtolower($word);
$chars = count_chars($word);
$numVowels = 0;
foreach (array("a", "e", "i", "o", "u") as $vowel) {
$numVowels += $chars[ord($vowel)];
}
return $numVowels / strlen($word);}, $animals);

不要错过第二部分。