2011-05-16 83 views
1

好吧所以我知道這是超級基礎,我應該知道如何做到這一點,但我空白,無法在Google中找到答案。我有一個包括具有的變量例如將數據傳遞到一個函數

$phrases["text"][1] = "How much wood would a woodchuck chuck if a woodchuck could chuck wood?"; 
$phrases["mp3"][1] = "http://example.com/file.mp3"; 

陣列然後該獲取可變因素的函數:

function return_phrase($phrase_name="", $fallback="",$default ="text"){ 
    $next= (isset($default) && $default =="mp3") ? 'text' : 'mp3'; 
    if(isset($tts_phrases[$default][$phrase_name])){ 
     return $phrases[$default][$phrase_name]); 
    } 
    else if(isset($tts_phrases[$next][$phrase_name])){ 
     return $phrases[$next][$phrase_name]); 
    } 

    else{ 
     return $fallback; 
    } 
} 

的問題是,所述$phrases陣列不被髮送到功能我可以在函數本身包含文件,但我知道這是做錯的方法。我想我需要使用$ global只是不知道如何。

+0

只需在函數中添加'global $ phrases,$ tts_phrases;'作爲第一行。 – Orbling 2011-05-16 23:15:20

+0

哦,並且在手冊中對[variable scope](http://php.net/manual/en/language.variables.scope.php)有很好的瞭解。 – Orbling 2011-05-16 23:16:55

回答

2

方法1:通過$短語,$ tts_phrases作爲參數

function return_phrase(array $phrases, array $ttphrases, $phrase_name="", $fallback="",$default ="text"){ 
    $next= (isset($default) && $default =="mp3") ? 'text' : 'mp3'; 
    if(isset($tts_phrases[$default][$phrase_name])){ 
     return $phrases[$default][$phrase_name]); 
    } 
    else if(isset($tts_phrases[$next][$phrase_name])){ 
     return $phrases[$next][$phrase_name]); 
    } 

    else{ 
     return $fallback; 
    } 
} 

方法2:$短語,$ tts_phrases全局(!不好)

function return_phrase($phrase_name="", $fallback="",$default ="text"){ 
    global $phrases, $tts_phrases; 
    $next= (isset($default) && $default =="mp3") ? 'text' : 'mp3'; 
    if(isset($tts_phrases[$default][$phrase_name])){ 
     return $phrases[$default][$phrase_name]); 
    } 
    else if(isset($tts_phrases[$next][$phrase_name])){ 
     return $phrases[$next][$phrase_name]); 
    } 

    else{ 
     return $fallback; 
    } 
} 

使用全局變量是一種快速,容易修復,但是一旦你的應用程序變大,他們就很難跟蹤。例如,採取這種傳統的代碼片段,我在工作中處理:

function foo() { 
    global $mysqldsn, $ldapdsn, $autologout_timer, $isMobileDevice, logout_fail_limit, $logout_fail_window, $lang, $project_contact_email, $project_contact_name ... (50 or 60 more global variables following) 
    ... 
} 

任何時候,我在看,只是拉這些變量的一個憑空的頁面之一,我必須按Ctrl + F整個項目,並確保每一個小小的變化並沒有搞亂整個應用程序。當你將變量保持在局部範圍內時,你確切地知道你在改變什麼。

+0

還有'$ tts_phrases',你可能也想解釋爲什麼'global'不好。 – Orbling 2011-05-16 23:18:33

+0

其實'$ tts_phrases'是唯一的數組。我正在嘗試刪除。我有一個問題,我如何調用函數我試着return_phrase('1','一些後備'),但得到錯誤'參數1傳遞給tts_phrase()必須是一個數組' – BandonRandon 2011-05-16 23:23:30

+1

'return_phrase($ tts_phrases,'1' ,'some fallback')' – 2011-05-16 23:25:35

相關問題