PHP回调有什么用?

Ahm*_*had -6 php callback

我想知道什么时候应该使用PHP回调函数,使用PHP回调函数代替传统函数有什么好处?

例如

以小写形式获取名称的传统方法

<?php
function string($string){
    $results = array(
        'upper' => strtoupper($string),
        'lower' => strtolower($string),
    );
    return $result;
}
$name = string('Ahmar');
echo $name; //Output: ahmar
?>
Run Code Online (Sandbox Code Playgroud)

使用回调获得相同的输出

<?php
function string($string, $callback){
    $results = array(
        'upper' => strtoupper($string),
        'lower' => strtolower($string)
    );
    if(is_callable($callback)){
        call_user_func($calllback, $result);
    }
}
string('Ahmar', function($name){
    echo $name['lower']; //Output: ahmar
});

?>
Run Code Online (Sandbox Code Playgroud)

请解释一下使用闭包回调有什么好处,我们应该什么时候使用它?谢谢

dec*_*eze 5

PHP 中几乎没有用于在操作完成时调用的回调,例如:

string('Ahmar', function ($name) { echo ... })
Run Code Online (Sandbox Code Playgroud)

这在像 Javascript 这样的语言中是非常惯用的;但那是因为 Javascript 的执行模式与 PHP 完全不同。在 Javascript 中,许多事情通常会同时发生,要么在浏览器中由于交互式 UI,要么在服务器上由于许多并行请求。PHP虽然在单线程中以非交互方式运行,因此需要异步协调的并行任务并不多。PHP 中的并行执行发生在不同的 PHP 实例中,而不是在同一个 PHP 实例中。

在 Javascript 中,当后台发生的事情完成处理时,您需要回调来协调应该发生的事情:

foo(bar => {
    // this happens after
});

// this happens before
Run Code Online (Sandbox Code Playgroud)

在 PHP 中,同样可以通过等待函数返回来实现:

// this happens before
$bar = foo();
// this happens after
Run Code Online (Sandbox Code Playgroud)

(请注意,当然也有例外;例如,在用 PHP 编写 Web 套接字服务器时,您将获得与在 node.js 中看到的相同的基于回调的架构。)

因此,在大多数情况下,当您不仅需要将值作为参数传递给算法,而且还需要将代码块作为参数传递时,您会使用回调。作为一个具体的例子,采取usort

usort($foo, function ($a, $b) { return $a['bar'] - $b['bar']; });
Run Code Online (Sandbox Code Playgroud)

此回调与异步执行无关,而是用于将自定义排序逻辑传递给函数。