2011-05-16 5 views
1

알았어.이 기본 기능이 뛰어났다는 것을 알고 있으며, 어떻게해야하는지 알고 있어야한다.하지만 나는 블랭킹 중이며 Google에서 답을 찾는 데 어려움을 겪고있다. I는 그 다음에 varibles를 취득하는 기능을 데이터를 함수로 전달

$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 배열이 함수 I로 전송되지 않는 것입니다 함수 자체에 파일을 포함 할 수 있지만 잘못된 방법이라고 생각합니다. 나는 $ global을 어떻게 사용해야하는지 잘 모르겠다.

+0

함수의 첫 번째 줄에'global $ phrases, $ tts_phrases; '를 추가하면됩니다. – Orbling

+0

오, 매뉴얼에 [가변 범위] (http://php.net/manual/en/language.variables.scope.php)에 대한 좋은 기사가 있습니다. – Orbling

답변

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 매개 변수로 문구를 $ : $ 문구를 확인이 $ 전역 변수를 사용하여 글로벌 (! 나쁜)

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; 
    } 
} 

가 빠른 tts_phrases 및 쉽게 고칠 수 있지만 응용 프로그램이 커지면 추적하기가 매우 어려워집니다. 예를 들어, 내가 직장에서 처리해야이 레거시 코드를 가지고 :

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 키를 가지고 + 전체 프로젝트를 수행하고 모든 작은 변화가 전체 앱을 엉망이 아닌지 확인하십시오. 변수를 로컬 범위로 유지하면 변경중인 내용을 정확히 알 수 있습니다.

+0

'$ tts_phrases'도 있는데'global'이 왜 나쁜지 설명하고 싶을 수도 있습니다. – Orbling

+0

사실'$ tts_phrases'만이 유일한 배열입니다. 나는 제거하려고했다. 내가 질문을 어떻게 return_phrase ('1', '일부 fallback') 시도한 함수를 호출하지만'인수 tts_phrase() 전달 된 배열을합니다. – BandonRandon

+1

'return_phrase ($ tts_phrases, '1' , 'some fallback')' –

관련 문제