2010-12-17 71 views
3

呼应的东西,让我们说,我有一组样功能的功能,PHP - 返回由其他功能

  • 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的论点。该功能可能需要的任何数量的参数...

回答

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' 

注意两件事情。

  1. 这是忽略被调用函数的return
  2. 我将结尾函数更改为ob_get_clean(),因为它删除了创建的缓冲区。你有的代码会为每个调用创建一个新的缓冲区,而不是删除它(因此需要将所有输出缓冲到大量缓冲区,因此会逐渐减慢所有输出)...
+0

谢谢。这工作:D – Alex 2010-12-17 16:33:02

3

为什么不创建一个可选的参数信号是否returnecho输出是这样的:

function article($output = false) 
{ 
    // your code.......... 

    if ($output === true){ 
    echo $result; 
    } 
    else{ 
    return $result; 
    } 
} 

现在如果你想呼应的东西出来的同样的功能,你应该在调用这样的功能时设定$output为true:

article(true); 

但是,如果你想只回报函数的结果,你可以把它叫做不指定$output

article(); 
+0

是的,我想到了太。但是不会像我的想法那样更直观,更优雅? – Alex 2010-12-17 16:12:54

3

你可以使用call_user_func_array(),这将让你也传递的参数数组。但是,最好让你的article()函数返回一个字符串,并且只在需要的时候回显它。

3

或者你可以只修改article()menu()有一个可选参数$return这是默认为false所以当$returntrue那么你会从相同的函数返回一个布尔值。

article($id, $return = false) 
{ 
    // ... 
    if($return) 
    { 
    return $article; 
    } else { 
    echo $article; 
    } 
} 
2

或者你可以从另一种方式来处理,并以一种总是返回值的方式编写这些函数。

然后如果你想呼应,你刚才说echo article();

1

是的,它是可能的。 您可能会喜欢here