【问题标题】:What is the use of callbacks/callables in PHP?PHP 中的回调/可调用对象有什么用?
【发布时间】:2017-01-12 09:53:40
【问题描述】:

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

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

有没有什么是回调函数不能在简单函数中完成的?

【问题讨论】:

    标签: php callback callable


    【解决方案1】:

    如果我们想要一个比基本排序函数提供的更复杂的排序逻辑...例如按特定属性对对象数组进行排序。使用回调,我们可以定义排序规则。

    这可以使用我们创建的标准 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);
    

    【讨论】:

      猜你喜欢
      • 2013-10-17
      • 2010-10-28
      • 2011-01-27
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 2017-10-07
      • 1970-01-01
      相关资源
      最近更新 更多