开发者

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 article
  • menu() - 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.

  1. This is ignoring the return of the called function.
  2. 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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜