PHP - a function that returns stuff that is echoed by other functions
let's say I have a set of functions like,
article()- outputs a articlemenu()- a menu
and so on...
sometimes I may need to only get the output of such functions, not print it to the screen. So instead of creating another set of functions that return the values like get_article(), get_menu() etc., could I make a single function that does this, using output buffering and call_user_func?
for eg.
function get($function_name){
ob_start();
call_user_func($function_name);
return ob_get_contents();
}
开发者_运维问答the problem in my code is that I don't know how could I pass the $function_name's arguments. The function might need any number of arguments...
Why not create an optional argument to signal whether to return or echo output something like this:
function article($output = false)
{
// your code..........
if ($output === true){
echo $result;
}
else{
return $result;
}
}
Now if you want to echo something out of the same function, you should set $output to true when calling the function like this:
article(true);
But if you want to just return the result of the function, you can call it without specifying $output:
article();
You could use call_user_func_array(), which would allow you to also pass an array of parameters. However it's probably better to make your article() function return a string and echo it only if needed.
Or you could just modify article() and menu() to have a last optional parameter $return which is a boolean that defaults to false so when $return is true then you would return from the same function.
article($id, $return = false)
{
// ...
if($return)
{
return $article;
} else {
echo $article;
}
}
It's easy... Simply fetch the arguments using 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();
}
Usage:
function foo($arg1, $arg2) { echo $arg1 . ':' . $arg2; }
$bar = get('foo', 'test', 'ing'); // $bar = 'test:ing'
Note two things.
- This is ignoring the
returnof the called function. - I changed the ending function to
ob_get_clean()since it deletes the created buffer. The code you had would make a new buffer for each call and not delete it (hence gradually slowing everything down as it needs to bubble all output up a large number of buffers)...
Or you could approach from the other way around, and write those functions in a way that they always return the values.
Then if you want to echo, you just say echo article();
Yes it's possible. You may like to look here.
加载中,请稍侯......
精彩评论