假设我有一组函数,例如
article()
- 输出文章menu()
- 菜单依旧......
有时候我可能只需要获取这些功能的输出,而不是将其打印到屏幕上。因此,不是创建另一组返回值get_article()
,get_menu()
等的函数,而是使用输出缓冲和call_user_func
创建一个单独的函数吗?
例如。
function get($function_name){
ob_start();
call_user_func($function_name);
return ob_get_contents();
}
我的代码中的问题是我不知道如何传递$function_name
的参数。该函数可能需要任意数量的参数......
答案 0 :(得分:3)
为什么不创建一个可选参数来表示是return
还是echo
输出如下内容:
function article($output = false)
{
// your code..........
if ($output === true){
echo $result;
}
else{
return $result;
}
}
现在,如果你想用相同的函数回显一些东西,你应该在调用这样的函数时将$output
设置为true:
article(true);
但如果您只想 返回 该功能的结果,您可以在不指定$output
的情况下调用它:
article();
答案 1 :(得分:3)
您可以使用call_user_func_array()
,这样您也可以传递一系列参数。但是,让article()
函数返回一个字符串并仅在需要时回显它可能会更好。
答案 2 :(得分:3)
或者您可以修改article()
和menu()
以获得最后一个可选参数$return
,这是一个默认为false
的布尔值,因此当$return
为true
然后你会从同一个函数返回。
article($id, $return = false)
{
// ...
if($return)
{
return $article;
} else {
echo $article;
}
}
答案 3 :(得分:2)
或者你可以从另一个方向接近,并以他们总是返回值的方式编写这些函数。
然后,如果你想回声,你只需说echo article();
答案 4 :(得分:2)
这很容易......只需使用func_get_args
...
function get($function_name){
$arguments = func_get_args();
array_shift($arguments); // We need to remove the first arg ($function_name)
ob_start();
call_user_func_array($function_name, $arguments);
return ob_get_clean();
}
用法:
function foo($arg1, $arg2) { echo $arg1 . ':' . $arg2; }
$bar = get('foo', 'test', 'ing'); // $bar = 'test:ing'
注意两件事。
return
。ob_get_clean()
,因为它删除了创建的缓冲区。您拥有的代码将为每个调用创建一个新缓冲区而不是删除它(因此需要逐渐减慢所有内容,因为它需要将所有输出冒泡到大量缓冲区中)... 答案 5 :(得分:1)
是的,这是可能的。 您可能希望查看here。