PHP中回调/可调用的用途是什么?

时间:2017-01-12 09:53:41

标签: php callback callable

我试图围绕PHP中的回调或做什么。

我看过文档,但它们有用吗?

回调的功能是否可以通过简单的功能完成?

1 个答案:

答案 0 :(得分:2)

回调用于允许我们将自定义逻辑应用于通用函数,如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);