我有一个可以在CLI或Web应用程序中使用的功能,可以说,这个过程有一些区别;例如:如果我在CLI中使用此功能,它将使用文本进度条,但如果我将此功能用于Web应用程序则没有意义。
该功能基本上是一个循环;所以我正在寻找的是一种方法,通过使代码作为参数传递成为可能使这个函数变得灵活,以便它将在每个循环周期结束时执行。所以,如果我在CLI中使用此功能;我将传递一个进度增量函数来推进进度条,依此类推。
我目前的解决方案是传递进度条对象实例,我认为这不是一个合适的解决方案;因为从长远来看它似乎不灵活。
我正在做的一个示例:
function myFunction($progressBar = null)
{
for($i = 0; $i......)
{
//Do stuff
....
//finally...
if(!empty($progressBar))
$progressBar->advance();
}
}
所以,如果我想在循环结束时添加另一个函数,我将不得不将其作为参数传递并稍后手动调用;但正如我所说,它似乎并不正确。
我正在考虑使用回调函数(传递给myFunction的匿名函数)但是这样做的正确方法是什么。我应该把每个回调函数作为一个单独的参数吗?或者,为了使其更加灵活,我是否应该将所有回调函数分组到一个数组中(如果可能的话)。
答案 0 :(得分:0)
是的,您可以使用回调。
function myFunction($progressBar = null, callable $callback = null)
{
for($i = 0; $i......)
{
//Do stuff
....
//finally...
if(!empty($progressBar))
$progressBar->advance();
}
if ($callback){ //Execute the callback if it is passed as a parameter
$callback();
}
}
此外,您可以指定匿名函数的参数:
示例:您希望在某些时候回应某些内容。
myFunction($progressBar) ; //No need yet
myFunction($progressBar, function($result){ echo $result ; }) ; //Now you want to execute it
所以,以适当的方式处理它:
if ($callback){ //Execute the callback if it is passed as a parameter
$callback("All is fine"); //Execute the callback and pass a parameter
}
回调数组在这种情况下也可能有用,如:
$callbacks = array(
"onStart" => function(){ echo "started" ; },
"onEnd" => function(){ echo "ended" ; }
) ;
function myFunc($progressBar = null, $callbacks){
if (isset($callbacks["onStart"]) && is_callable($callbacks["onStart"])){
$callbacks["onStart"]() ;//Execute on start.
}
//Execute your code
if (isset($callbacks["onEnd"]) && is_callable($callbacks["onEnd"])){
$callbacks["onEnd"]() ;//Execute on end.
}
}