2014-01-30 59 views
0

我有一個奇怪的問題,這可能是不可能的,但值得一提的是,如果有任何PHP內部的書呆子知道如何去做。有沒有辦法從PHP中的函數調用中獲取變量名?它會更容易舉一個例子:奇怪的PHP自省:從函數調用中獲取原始變量名稱?

function fn($argument) { 
    echo SOME_MAGIC_FUNCTION(); 
} 

$var1 = "foo"; 
$var2 = "bar"; 

fn($var1); // outputs "$var1", not "foo" 
fn($var2); // outputs "$var2", not "bar" 

你說這之前 - 是的,我知道這將是在生產代碼中沒有使用一個可怕的想法。不過,我正在將一些舊代碼遷移到新代碼中,這將允許我非常輕鬆地自動生成替換代碼。謝謝!

+0

的〔確定其傳遞到功能後變量的原始名稱]可能重複(http://stackoverflow.com/ questionarray/3404057 /確定函數傳遞後的原始名稱變量) – deceze

+0

'$ arg = func_get_arg(0); var_export($ arg);'可以做到這一點。忽略這可能不是。如何使用類而不是函數,然後使用反射可能會得到類參數列表? – Dave

+0

@Dave它不會。 – deceze

回答

1

debug_backtrace()返回當前調用堆棧的信息,包括調用當前函數的文件和行號。您可以讀取當前腳本並解析包含該調用的行,以查找參數的變量名稱。

與debug_backtrace測試腳本:

<?php 
function getFirstArgName() { 
    $calls=debug_backtrace(); 
    $nearest_call=$calls[1]; 

    $lines=explode("\n", file_get_contents($nearest_call["file"])); 

    $calling_code=$lines[$nearest_call["line"]-1]; 

    $regex="/".$nearest_call["function"]."\\(([^\\)]+)\\)/"; 

    preg_match_all($regex, $calling_code, $matches); 

    $args=preg_split("/\\s*,\\s*/", $matches[1][0]); 

    return $args[0]; 
} 

function fn($argument) { 
    echo getFirstArgName(); 
} 

$var1 = "foo"; 
$var2 = "bar"; 

fn($var1); 
fn($var2); 
?> 

輸出:

$var1$var2 
+0

真棒,出色的扭曲,它的作品。非常感謝,Gus! – joshwoodward