我正在学习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');
答案 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'];
}
);