2010-10-12 13 views
8

parametreleri __FILE__ ve __LINE__ vardır - İşlevin arayanın olanlar, işlev hata raporlama bunları kullanın böylece.İşlev çağrıları için parametre sağlamak için bir PHP "makrosu" (#define gibi) yapabilir miyim? Ancak bahsettiğimiz

ı iki dosya ve file_1.php çizgisini 100 Öyle my_func bir hatayla karşılaşırsa o file_1 karşı bildirebilirsiniz o kararı my_func(__FILE__, __LINE__) yapmak istiyorum my_func()

file_2.php çağrıları var diyelim 100.

Bunu yapmak için yüzlerce çağrı my_func olduğundan ve hataların my_func() öğesinde bildirilmesinin kendisi bilgilendirici olmayabilir (yığımı boşaltmadan). Ve bu iki parametreyi birkaç yüz kez elle yazmak zorunda kalmak istemiyorum. C ı #define MY_FUNC my_func(__FILE, __LINE) böyle bir şey yapsın yılında

- PHP benzer bir şey yapabilirim?

cevap

10

Maalesef PHP makrolar her türlü bulunmamaktadır. Makro eklemek için bazı girdilerin üzerine sed gibi bir komut satırı aracı çalıştırarak bunları kendiniz uygulayabilirsiniz, ancak bu hataya eğilimli ve biraz özensiz. Eğer ne yapmak istediğinizi yapmak için

, sen debug_backtrace fonksiyonunu düşünebilirsiniz.

+0

7 veya 8 yıl sonra yine bu soruyu buldum & burada – Mawg

2

Nope. Bir yığın izleme kullanın: debug_backtrace(). Geri dönen dizinin ikinci satırına bakarak, arayanın dosyasını ve hattını alabilirsiniz.

2

Maalesef PHP Makro gibi hiçbir C yoktur.

bir debug_backtrace okuma zor ve ben pek sevmiyorum.

Hata noktalarında bir istisna atmak istediğim istisna nesnesi, kendisinin de yığın izini ve ayrıca gelen satır numarasını ve dosyasını içerir.

catch (Exception $e) 
{ 
    $errorMessage = $e->getMessage() . " LINE: " .$e->getLine(). " FILE: " . $e->getFile(); 
} 
+1

Checkout bu lib önerildiği gibi ben istisnalar için Mojtab cevabı bir arada kullanın demek adn backtrace düşündüm https://www.sitepoint.com/ php-makro-for-fun-and-kar / –

2

Kaynak dosyası yeniden yazımı yardımıyla C benzeri makroları çoğaltabilirsiniz.

Yaz dosya macro.php: Böyle aracıyla Şimdi

<?php 

$name = $_SERVER['PHP_SELF']; 
$name = preg_replace('#\/#mui', '', $name); 

$file = file_get_contents($name); 

// get defined macros 
preg_match_all('#\#macro\h+(\w+)\h+(.*)$#mui', $file, $matches, PREG_SET_ORDER); 

foreach ($matches as $m) { 
    // delete macro definition 
    $file = str_replace($m[0], '', $file); 
    // substitute macro => value 
    $file = str_replace($m[1], $m[2], $file); 
} 

// save processed file 
$new_name = '/var/tmp/' . $name . '.pr'; 
file_put_contents($new_name, $file); 

include_once $new_name; 
exit; 

, kullanım basit:

<?php 

include_once "macro.php"; 

#macro DEBUG_INFO ;echo('<b> DEBUG_INFO: __FILE__ : ' . __FILE__ . ';__LINE__ : ' . __LINE__ . '</b>') 

echo '<br>'.(1/2); DEBUG_INFO; 
echo '<br>'.(1/0); DEBUG_INFO; 
echo '<br>'.(0/0); DEBUG_INFO; 

zaman idam çıkışlar:

0,5 DEBUG_INFO: DOSYA:/var /tmp/test.php.pr; HAT: 7

INF DEBUG_INFO: DOSYA: /var/tmp/test.php.pr; HAT: 8

NAN DEBUG_INFO: DOSYA: /var/tmp/test.php.pr; SATIR: 9

Güçlü C geçmişi ve PHP hep cevapsız C benzeri makro var. Ama umarım bunun için bir çeşit değiştirme yapabiliriz.

İlgili konular