我获得了一个API,我目前正在进行工程设计。特别是有一个功能让我在充分理解其目的/用途时遇到麻烦。
private function split($data, Callable $callback)
{
$split = array();
if ($data) {
$split = array_map(function($joined) use ($callback) {
return $callback(explode('::', $joined));
}, explode(',', $data));
}
return $split;
}
我不完全理解Callable
的概念,以及array_map
,function($joined)
中的函数然后这个函数USE可调用变量,有人可以解释这个概念吗
答案 0 :(得分:2)
Callable参数是一个可以调用的参数!正如您在代码中看到的那样,参数$callback
像函数一样使用:$callback(...)
这称为高阶编程,这在某些情况下非常有用。一个简单的例子:假设您必须编写一个函数来添加2和另一个函数,该函数乘以数组中每个元素的2。一个简单但冗长的方法是:
function multiply($array) {
$results = array();
foreach ($array as $number) {
$results[] = $number * 2;
}
return $results;
}
function add($array) {
$results = array();
foreach ($array as $number) {
$results[] = $number + 2;
}
return $results;
}
很多代码在2个函数中是相同的。在这种情况下,高阶编程很有用,你可以做的是创建一个函数apply($function, $array)
,它将函数$function
应用于$ array的所有元素,并返回一个带有结果的数组。
function apply($function, $array) {
$results = array();
foreach ($array as $number) {
$results[] = $function($number);
}
return $results;
}
现在,如果你想将所有元素乘以2或加2,你只需:
function multiply($array) {
return apply(function($number) {
return $number * 2;
}, $array);
}
function add($array) {
return apply(function($number) {
return $number + 2;
}, $array);
}
你看,我们给一个函数作为apply
函数的参数。此函数(在$function
中称为apply
)应用于$array
的所有元素,apply
返回结果(称为$results
)。
PHP函数array_map
完全相同。当你的代码调用array_map
时,它给出一个函数,它接受一个参数(要处理的数组的元素)并返回已处理的元素(这里,它只是将函数$callback
应用于它)。 / p>