回调/可调用函数在PHP中有什么用途



我正试图了解回调是什么或在PHP中做什么。

我看过这些文档,但它们有什么用处?

回调所做的事情是不是在简单函数中无法完成的?

回调用于允许我们将自定义逻辑应用于像usort()这样的泛型函数以进行数组排序,如果我们想要比基本排序函数提供的更复杂的排序逻辑。。。例如,按特定属性对对象数组进行排序。使用回调,我们可以定义排序规则。

这可以使用标准的PHP函数来定义,我们已经创建了

$data = [
(object) ['myDate' => '2017-01-12'],
(object) ['myDate' => '2016-12-25'],
(object) ['myDate' => '2017-01-01'],
];
function dateSort($a, $b) {
return $a->myDate <=> $b->myDate;
}
usort($data, 'dateSort');
var_dump($data);

或使用匿名功能

$data = [
(object) ['myDate' => '2017-01-12'],
(object) ['myDate' => '2016-12-25'],
(object) ['myDate' => '2017-01-01'],
];
usort($data, function($a, $b) { return $a->myDate <=> $b->myDate; });
var_dump($data);

因此,我们应用于usort()的回调允许我们应用其他sort()函数无法使用的复杂逻辑。


匿名函数给了我们更多的灵活性:许多数组函数(如usort()array_filter())使用的回调会自动接收函数中的某些参数,例如usort()会从数组中传递两个值以进行排序。。。如果你只是简单地比较这两个值,你可以创建一个简单的函数并使用它;但是,如果我们想排序,以某个值为中心,比如2016-12-31,会发生什么,所以我们根据截止/自该日期起的天数进行排序;我们需要一个新的函数,一个将日期硬编码为枢轴值的函数:

$data = [
(object) ['myDate' => '2017-01-12'],
(object) ['myDate' => '2016-12-25'],
(object) ['myDate' => '2017-01-01'],
];
function dateSort($a, $b) {
return abs(strtotime('2016-12-31') - strtotime($a->myDate)) <=> abs(strtotime('2016-12-31') - strtotime($b->myDate));
}
usort($data, 'dateSort');
var_dump($data);

现在我们进入有趣的部分,如果我们想动态分配我们的数据透视日期值,会发生什么?我们无法向usort()回调传递任何其他参数,那么如何在运行时传递透视值"2017-01-06"或"2017-12-26"呢?以下是匿名回调特别有用的地方,因为我们可以通过use:轻松地将附加参数传递给匿名函数

$data = [
(object) ['myDate' => '2017-01-12'],
(object) ['myDate' => '2016-12-25'],
(object) ['myDate' => '2017-01-01'],
];

$pivotDate = '2017-01-06';
usort(
$data,
function ($a, $b) use ($pivotDate){
return abs(strtotime($pivotDate) - strtotime($a->myDate)) <=> abs(strtotime($pivotDate) - strtotime($b->myDate));
});
var_dump($data);

相关内容

  • 没有找到相关文章

最新更新