在PHP中使用回调函数有什么用?

时间:2018-06-19 08:24:10

标签: php callback synchronous

我正在学习PHP,回调函数的概念让我有些困惑。我知道有同步和异步回调,PHP中的常见回调是同步的。我已经阅读了很多关于这个主题的信息,但我仍然没有更聪明。

这是怎么回事:

function string($string, $callback) {
    $results = array(
        'upper' => strtoupper($string),
        'lower' => strtolower($string)
    );

    if(is_callable($callback)) {
        call_user_func($callback, $results);
    }
}

string('Danny', function($name) { 
    echo $name['upper']; 
    }
);

与此不同或更好:

function string($string, $case) {
    $options = [
        'upper' => strtoupper($string),
        'lower' => strtolower($string)
    ];

    echo $options[$case];
}

string('Danny', 'upper');

2 个答案:

答案 0 :(得分:0)

以下是回调优于直接值的典型示例:

function intricateProcessToCalculateDefault() {
   //Takes 3 seconds
}

function valueOrDefault($value, $default = null) {
    if ($value === null) {
        if (is_callable($default)) {
           return $default();
        }
        return $default;
    }
    return $value;
}

现在考虑以下两个例子:

$valueToUse = valueOrDefault(
                  $_GET["parameterWithFallback"] ?? null, 
                  intricateProcessToCalculateDefault()
              );

// or 

$valueToUse = valueOrDefault(
                 $_GET["parameterWithFallback"] ?? null, 
                 function () { return intricateProcessToCalculateDefault(); }
              );

现在就是这样。如果你没有通过parameterWithCallback,这将需要3秒。但是,如果你这样做,那么intricateProcessToCalculateDefault如果作为回调传递将永远不会被调用,因此将节省您的时间。

在您的情况下,由于在任何一种情况下运行功能代码,都没有任何好处。

PHP主要是同步的,因此没有简单的方法来获取异步函数。有些库确实提供了它们,但这通常与调用shell可执行文件或类似的东西有关。

另一个用例是inversion for control。有许多通用算法可以用“占位符”实现用户代码。 array_map就是这样一个例子。

$array = [ "string1", "sting2" ];
$action = "upper";
array_map(function ($value) use ($action) {
    return ucfirst(strtolower($value));
}, $array);

在这种情况下,控制被反转。 PHP函数调用您的函数而不是相反。

答案 1 :(得分:-1)

在这个带回调的示例中,您可以轻松传递不同的函数而无需更改原始代码:

<?php

function string($string, $callback) {
    $results = array(
        'upper' => strtoupper($string),
        'lower' => strtolower($string)
    );

    if(is_callable($callback)) {
        call_user_func($callback, $results);
    }
}

string('Danny', function($name) { 
    echo $name['upper']; 
    }
);

string('Danny', function($name) { 
    echo 'Mr.'.$name['upper']; 
    }
);

string('Danny', function($name) { 
    echo 'Mrs.'.$name['upper']; 
    }
);