PHP işlevi: argümanının değişken adını bulmak, ve fonksiyon satır numarasını arar

6 Cevap

Ben günlük işlemlerini basitleştirmek için böyle bir şey yapmak istiyorum. I ?[1]? ve ?[2]? için koymak ne herhangi bir fikir?

function log_var($var) {
  $line = ?[1]?;
  $var_name = ?[2]?;

  $line--;

  $filepath = 'log-' . date('Y-m-d'). '.txt';
  $message  = "$line, $var_name = $var\n";
  $fp = fopen($filepath, "a");
  fwrite($fp, $message);
  fclose($fp);
  @chmod($filepath, 0666);
  return TRUE;
}

Ben kodu fonksiyonunu (numaraları, gerçek kod satır numaraları olduğu varsayılır) kullanmak istiyorum nasıl bu:

23  $a = 'hello';
24  log_var($a);
25  $b = 'bye';
26  log_var($b);

Ve bu günlük dosyasına yazılacak istiyoruz:

23, a = hello
25, b = bye

EDIT I converted Paul Dixon function a bit and added the result as an answer. The new form does even MORE than I originally hoped for. Thank you again guys!

6 Cevap

Işlev parametre fonksiyon denir önce değerlendirilen bir ifade olarak bu, kolayca yapabileceği bir şey değildir. Bu nedenle, bu fonksiyon, sadece bu ifade değeri değil, kendisini ifade görebilirsiniz.

Eğer really Bunu yapmak istiyorsanız, size gelen ifadeyi dışarı ayrıştırmak sonra, kaynak dosyadan çizgi ayıklamak, debug_backtrace arayanın dosya ve satır numarasını bulmak için kullanabilirsiniz işlev çağrısı. Burada bir proof-of-concept bulunuyor:

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

Açıkçası fındık. Ama çalışıyor :) Sen ders sadece birlikte değişken adını geçebileceği!

Sen Reflection ile yakın bir şey yapmak mümkün olabilir. Bunun dışında olsa da, çok başka bir şey yok.

Paul Dixon (kabul edilen yanıt) tarafından sağlanan işlevi ile oynanan ve şekli gerçekten istediğim ne yapıyor içine aldım. Bu fakir adamın ayıklayıcıyla hareket olabilir, ve ben bunu birine yararlı olacağını umuyoruz.

İşte fonksiyonu ve örnek kullanımı / çıktı:

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

Ve burada örnek bir kullanım (numaraları, gerçek kod satır numaralarını temsil) 'dir:

41 //examples...
42 $a='hello';
43 dump($a);
44
45 $b = 'bye';
46 dump($b);
47
48 $c = date('y-m-d');
49 dump($c);
50
51 $c = $a . ' and then ' . $b;
52 dump($c);

Örnek günlük dosyasında bu çıktıyı üretecektir:

42  $a='hello';
    $a = hello

45  $b = 'bye';
    $b = bye

48  $c = date('y-m-d');
    $c = 10-05-20

51  $c = $a . ' and then ' . $b;
    $c = hello and then bye

Değişken adı alınamıyor.

Sadece bunu yapabilirsiniz rağmen

log_var("a",$a);
log_var("b",$b);

Bu sorun değişken eşsiz bir değere sahip olmasıdır: (

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('Y-m-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__);

Açıklama: Eğer bu gibi şeyler yapmaya çalışmayın gerekir ... bu tavsiye değil ve ne istediğinizi yapmak için muhtemelen daha iyi yolları vardır.

Bu yapılabilir eğer ben size ne yapabilirim değişkeni ayarlanır nerede hat numarasını, olsun, bilmiyorum:

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('Y-m-d'). '.txt';
  $message  = "$line, $var_name = $var\n";
  $fp = fopen($filepath, "a");
  fwrite($fp, $message);
  fclose($fp);
  @chmod($filepath, 0666);
  return TRUE;
}

Yani bunu yapabilirsiniz:

23  $a = 'hello';
24  log_var($a,'$a');
25  $b = 'bye';
26  log_var($b,'$b');

ve çıkış, bu gibi görünecektir:

23, a = hello
25, b = bye

Ben bunu daha iyi alabilirsiniz inanmıyorum. Birisi nasıl bilir ama, ben öğrenmek için hazırım