2011-10-28 30 views
0

對於PHP測試腳本我需要一個函數report(),將報告一些表達式的結果,如:是否可以在PHP中轉儲參數表達式?

report(in_array(null, $array)); 
report(in_array(false, $array)); 
# etc... 

輸出應該是這樣的:

in_array(null, $array) => false 
in_array(false, $array) => true 

所以我要打印表達式與結果一起。因此,在報告功能,我需要一些手段如何打印這是由主叫方給出的表達式:

function report($expr) 
{ 
    SOME_FUNCTION($expr) 
     # function I'm looking for!! 
     # function which would write the string 'in_array(null, $array)' to output! 
    echo " => "; 
    echo $expr; 
    echo "<br>"; 
} 

是否存在被調用者因爲將轉儲表達任何這樣的功能呢? 我知道這不能是「正常」的功能,這需要以某種方式綁定到PHP的內部。但是,如果有喜歡的debug_print_backtrace()__FUNCTION____LINE__神奇的東西,那麼我認爲還是可以有一些機會......

+1

這與'assert('$ expr()');'類似。雖然你可能無法將它用於你的事業。 – mario

回答

3

直接,沒有就沒有乾淨的方法做你想要什麼。

這樣說,你可以使用debug_backtrace來獲得堆棧。然後,你需要做的就是將棧放回一個(轉到第二個數組元素),並且你有文件和行信息。然後,您需要解析該行以提取函數名稱和輸入。

它不會乾淨。這不可能是容易的。它不會100%可靠。但它應該適用於大多數情況...

這裏是一個簡單的實用功能的情況下做到這一點。剛剛與函數名字稱呼它,它會給你的函數的字面來電者:

function getArgs($func) { 
    $d = debug_backtrace(); 
    $call = $d[1]; 
    $file = file($call['file']); 
    $line = $file[$call['line'] - 1]; 
    if (preg_match('(' . preg_quote($func, '(') . '\((.*)\);)', $line, $match)) { 
     return $match[1]; 
    } 
    return $line; 
} 

而且這裏有一個例子:

function doSomething($arg) { 
    $call = getArgs(__FUNCTION__); 
    echo $call . ' - ' . $arg; 
} 

doSomething(strlen('foo')); 

將輸出:

的strlen ('foo') - 3

+0

棘手的解決方案,謝謝。 – TMS

+0

@TomasT:這不是100%可靠的(尤其是解析呼叫),但總比沒有好。它會嘗試返回參數,如果失敗,它將返回整行。你可以擴展正則表達式以及... – ircmaxell

相關問題