Я хочу сделать что-то подобное для упрощения операций регистрации. Любая идея, на что я должен положиться ?[1]?
и ?[2]?
?
function log_var($var) { $line = ?[1]?; $var_name = ?[2]?; $line--; $filepath = 'log-' . date('Ym-d'). '.txt'; $message = "$line, $var_name = $var\n"; $fp = fopen($filepath, "a"); fwrite($fp, $message); fclose($fp); @chmod($filepath, 0666); return TRUE; }
Это то, как я буду использовать функцию в коде (числа считаются номерами строк в реальном коде):
23 $a = 'hello'; 24 log_var($a); 25 $b = 'bye'; 26 log_var($b);
И это то, что я хочу записать в файл журнала:
23, a = hello 25, b = bye
EDIT Я немного изменил функцию Пола Диксона и добавил результат в качестве ответа. Новая форма даже БОЛЬШЕ, чем я изначально надеялся. Еще раз спасибо, ребята!
Это не то, что вы можете легко сделать, поскольку параметр функции – это выражение, которое оценивается до вызова функции. Таким образом, функция может видеть только значение этого выражения, а не само выражение.
Если вы действительно хотите это сделать, вы можете использовать debug_backtrace, чтобы найти номер файла и строки вызывающего, извлечь эту строку из исходного файла, а затем проанализировать выражение из вызова функции. Вот доказательство концепции:
function dump($value) { $trace=debug_backtrace(); $expr="<unknown>"; if (isset($trace[0]['file'])) { $lines=file($trace[0]['file']); $line=$lines[$trace[0]['line']-1]; $expr=$line; $expr=preg_replace('/\s*dump\(/i','', $expr); $expr=preg_replace('/\);\s*/', '', $expr); } echo "$expr is $value\n"; } //examples... $a=10; dump($a); dump($a+10);
Ясно орехи. Но он работает 🙂 Вы могли бы просто передать имя вместе с переменной!
Возможно, вы сможете сделать что-то близко с Reflection . Кроме того, в этом нет ничего другого.
Я играл с функцией, предоставленной Полом Диксоном (принятый ответ), и получил его в форму, которая действительно делает то, что я хочу. Это может быть отладчиком бедных, и я надеюсь, что это будет полезно кому-то.
Вот функция и пример использования / вывода:
function dump($value) { $trace=debug_backtrace(); $expr="<unknown>"; if (isset($trace[0]['file'])) { $myline = $trace[0]['line']; $myline--; $lines=file($trace[0]['file']); $line=$lines[$trace[0]['line']-1]; $expr=$line; $expr=preg_replace('/\s*dump\(/i','', $expr); $expr=preg_replace('/\);\s*/', '', $expr); } $handle = @fopen(__FILE__, "r"); if ($handle) { for ($l=1; $l < $myline+1; $l++) { $buffer = fgets($handle); } } fclose($handle); $message = "$myline \t $buffer \t $expr = $value \n\n"; $filepath = 'log.txt'; $fp = fopen($filepath, "a"); fwrite($fp, $message); fclose($fp); @chmod($filepath, 0666); return TRUE; }
И вот пример использования (числа представляют номера строк в фактическом коде):
41 //examples... 42 $a='hello'; 43 dump($a); 44 45 $b = 'bye'; 46 dump($b); 47 48 $c = date('ym-d'); 49 dump($c); 50 51 $c = $a . ' and then ' . $b; 52 dump($c);
В примере этот результат будет выводиться в файле журнала:
42 $a='hello'; $a = hello 45 $b = 'bye'; $b = bye 48 $c = date('ym-d'); $c = 10-05-20 51 $c = $a . ' and then ' . $b; $c = hello and then bye
Вы не можете получить имя переменной.
Хотя вы можете сделать это просто
log_var("a",$a); log_var("b",$b);
Проблема в том, что переменная должна иметь уникальное значение 🙁
function log_var($var, $line) { $var_name = 'unknown'; foreach($GLOBALS as $var_name => $value) if ($value === $var) $var_name = $var_name; $line--; $filepath = 'log-' . date('Ym-d'). '.txt'; $message = "$line, $var_name = $var\n"; $fp = fopen($filepath, "a"); fwrite($fp, $message); fclose($fp); @chmod($filepath, 0666); return TRUE; } $a = 'hello'; log_var($a, __LINE__);
Уточнение: вы НЕ должны пытаться делать такие вещи … это не рекомендуется, и есть, вероятно, лучшие способы делать то, что вы хотите.
Я не знаю, можно ли это сделать, чтобы вы получили номер строки, где установлена переменная, что вы можете сделать:
function log_var($var, $var_name) { $backtrace = debug_backtrace(); $line = $backtrace[0]['line']; // get's the line of the call for log_var $line--; $filepath = 'log-' . date('Ym-d'). '.txt'; $message = "$line, $var_name = $var\n"; $fp = fopen($filepath, "a"); fwrite($fp, $message); fclose($fp); @chmod($filepath, 0666); return TRUE; }
Таким образом, вы можете сделать это:
23 $a = 'hello'; 24 log_var($a,'$a'); 25 $b = 'bye'; 26 log_var($b,'$b');
и выход будет выглядеть следующим образом:
23, a = hello 25, b = bye
Я не верю, что вы можете улучшить ситуацию. Но если кто-то знает, как это получить, я готов учиться