2015-01-12 4 views
0

Я пытаюсь создать функцию, где я могу передать определенные переменные внутри функции другой функции, чтобы я мог извлечь переменные и использовать их. Позвольте мне сначала показать, что я пытаюсь сделать, поэтому имеет смысл.Почему compact() возвращает пустой массив внутри функции?

function naija_render($filePath, $defined_vars) 
{ 
    $viewData = compact(array_keys($defined_vars)); 
    extract($viewData); 

    ob_start(); 
    include ($filePath . '.php'); 
    $template = ob_get_contents(); 
    ob_end_clean(); 

    return $template; 
} 

Теперь позвольте мне упростить и уточнить.

если я печатаю этот

print_r(compact(array_keys(get_defined_vars()))); 

печатает компактный массив, однако, когда я пытаюсь сделать то же самое в функции, так что я могу просто пройти get_defined_vars() как $defined_vars, он печатает пустой массив.

function get_compact_defined_vars($defined_vars){ 
    //Returns blank array 
    print_r(compact(array_keys($defined_vars)); 
} 
+0

Это потому, что функции имеют свой собственный объем. Они не видят никаких переменных, объявленных вне их. Итак, в функции в вашем последнем примере вы говорите ей, чтобы создать массив из всех переменных, определяемых ключами в 'defined_vars', но это невозможно, потому что функция не имеет к ним доступа. –

ответ

0

Попробуйте это:

//something like that: 
naija_render('viewfile', array('var1', 'varN')); 


//rewrite your function like that: 
function naija_render($filePath, $defined_vars) 
{ 
    $viewData = array(); 
    foreach ($defined_vars as $var) { 
     $viewData[$var] = isset($GLOBALS[$var]) ? $GLOBALS[$var] : null; 
    } 
    extract($viewData); 
    ob_start(); 
    include ($filePath . '.php'); 
    $template = ob_get_contents(); 
    ob_end_clean(); 

    return $template; 
} 

EDIT: Я не рекомендую это, но это действительно решить вашу проблему.

+0

Это проблема, которую я пытаюсь решить, передав get_defined_vars() как «$ defined_vars», поэтому мне не нужно создавать массив из всех переменных, которые я хочу передать. –

+0

Хм .. вижу. Я могу дать вам «не рекомендованный» ответ. Подожди секунду. –

+0

проверьте это. –

Смежные вопросы