2013-05-20 5 views
0

Я пишу метод для генерации подробных данных для ведения журналов функций и аргументов в режиме отладки. Я ранее воспроизведен тот же код в нескольких местах (плохо), но она работает просто отлично (хорошо):get_func_argNames и переменные переменные

function validate_date($date) 
{ 

    if ($condition) 
    { 
     $php_function  = __FUNCTION__; 
     $php_function_args = implode(', ',get_func_argNames($php_function)); 
     foreach (get_func_argNames($php_function) as $arg) 
     { 
      $txt.= "$arg: ${$arg}<br>"; 
     } 
    } 
} 

Так что я написал новый метод, чтобы сделать это легче поддерживать:

$_debug_txt = return_debug_header(__FUNCTION__); 

function return_debug_header($php_function) 
{ 

    // returns debug string to debug handler 
    $arr_args = get_func_argNames($php_function); 
    $php_function_args = implode(', ',$arr_args); 
    if (is_array($arr_args)) { 
     foreach ($arr_args as $arg) 
     { 
      // $arg shows the right variable NAME, but ${$arg} is null. 
      $txt.= "$arg: ${$arg}<br>"; 
     } 
    } else { 
     $txt = 'No arguments passed.'; 
    } 

It может быть использован как этот

function validate_date($date) 
{ 

    if ($condition) 
    { 
     // generate debug header only if debug is true. 
     $_debug_txt = return_debug_header(__FUNCTION__); 
     // do something with txt... 
    } 
} 

проблема в том, что переменные переменные не отображается для работы с данными, полученными из get_func_argNames. Имеются имена переменных (я могу напечатать их на экране), но соответствующее значение будет пустым.

PHP предупреждает, что variable variables do not work with superglobals, однако неясно, считаются ли данные, возвращенные из get_func_argNames, «суперглобальными».

Кто-нибудь видит что-нибудь еще, что может привести к тому, что переменные переменные не будут работать внутри этой функции?

+0

Это не будет работать из-за переменных областей. Переменная '$ date' существует только в функции' validate_date() ', а не в' return_debug_header() '. – Barmar

+0

$ date получается из массива 'get_func_argNames (__ FUNCTION __)'. Я не уверен, что буду следовать. –

+0

Переменная переменная оценивается внутри 'return_debug_header()', поэтому ее можно использовать только для доступа к переменным в ее области действия, а не в области других функций. – Barmar

ответ

1

Вы не можете получить доступ к локальным переменным в одной функции из другой функции. Переменные переменные работают только в локальной области. Поэтому вам нужно передать аргументы в виде массива функции отладки.

function return_debug_header($php_function, $args) 
{ 

    // returns debug string to debug handler 
    $arr_args = get_func_argNames($php_function); 
    if (is_array($arr_args)) { 
     foreach ($arr_args as $i => $arg) 
     { 
      $txt.= "$arg: {$args[$i]}<br>"; 
     } 
    } else { 
     $txt = 'No arguments passed.'; 
    } 
} 

Используйте это как:

$_debug_text = return_debug_header(__FUNCTION__, func_get_args()); 
+0

'func_get_args()' сделал трюк. Благодарю. –

0

Для дальнейшего то, что вы можете получить от этого исследования "Сфера" в программировании. Важно понимать работу переменного доступа и программирования в целом. http://en.wikipedia.org/wiki/Scope_(computer_science)

+0

Я знал о сфере видимости (см. Комментарий выше), но способ, которым я обращался к переменной (и области), был затенен. Теперь я вижу свет. –

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