2010-12-17 69 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