2011-04-09 86 views
-1

func(CONST_A)應該返回'CONST_A'func($name)應該返回$name如何在PHP中以編程方式獲取變量/常量名稱?

如何實現這個func在PHP?

+0

[如何在PHP中獲取變量名稱作爲字符串?](http://stackoverflow.com/questions/255312/how-to-get-a-variable-name-as-a-string -in-php) – 2011-04-09 03:39:12

+0

@Marc,它適用於變量,但不適用於CONSTANTS ... – 2011-04-09 03:44:45

+0

設置另一個函數並處理從'get_defined_constants()'返回的數據。據我所知,函數沒有辦法告訴它的參數是來自變量還是常量。它只能看到var/constant的內容,而不是來源。你必須設置兩個功能,兩個做你想做的事。一個是vars,一個是consts。 – 2011-04-09 03:48:13

回答

0

這似乎並不可能輕易。

您可以使用reflection來確定parameters of the function,但它會返回函數期望的變量名稱,如果您已經在函數中,那麼您已經知道這些變量名稱。

debug_backtrace是什麼叫你偷看的常用方法,但它返回的值傳遞的參數,而不是進行調用時使用呼叫者的變量名稱或常量

然而,它確實給你的是文件名和調用者的行號,所以你可以打開文件,並尋求到該行並解析出來,但是這將是很無聊,你不應該這樣做。我不會給你這個例子的代碼,因爲它非常愚蠢,你不應該考慮這樣做有史以來

get_defined_vars事情是一個黑客,並不能保證工作,並且肯定不會用於常量,因爲get_defined_constants這樣做。

+0

好吧,我放棄這個想法:) – 2011-04-09 04:18:34

+0

你叫我完全傻。那麼,事實是,我在一個很酷的函數中做這個事情,我總是使用對象檢查。這不是生產環境,我承認它,但讓我告訴你這對於調試非常方便。 – 2011-07-27 05:36:58

0

試試這個:

<?php 
function getVarConst($var) 
{ 
    if (isset($GLOBALS[$var]) // check if there is a variable by the name of $var 
    { 
     return $GLOBALS[$var]; // return the variable, as it exists 
    } 
    else if (defined($var)) // the variable didn't exist, check if there's a constant called $var 
    { 
     return constant($var); // return the constant, as it exists 
    } 
    else 
    { 
     return false; // return false, as neither a constant nor a variable by the name of $var exists 
    } 
} 
?> 
+0

它不適用於const,請嘗試'define('CONST_A','test'); echo getVarConst(CONST_A);' – 2011-04-09 04:05:12

+0

這些名稱必須作爲字符串傳遞。如果您將它們作爲變量或常量傳遞,則函數會接收常量/變量的值。據我所知,除非循環遍歷$ GLOBALS和get_defined_constants()來查找值,否則從它的值中獲取常量或變量的名稱是不可能的,而且這很愚蠢 - PHP將在每個請求(也解析,如果你不使用操作碼緩存)。它會讓你的應用/腳本執行得如此糟糕,這不值得。 – ShotgunToothpaste 2011-04-09 04:09:50

+0

說實話,你不應該需要這個代碼,除非你的應用程序需要能夠獲取設置的值,而不管用戶是將它定義爲常量還是變量。 例如你可以使用它來完成這個工作,所以'$ db ='myDb';'或'define('db','myDb');'都可以使用,你可以通過'getVarConst('db ');'所以你得到可用的值,變量優先於常量。 – ShotgunToothpaste 2011-04-09 04:11:40

0

這是不可能的。

你真的想要以下權利?

define('CONST_A', 'THIS COULD BE ANYTHING'); 
$name = 'who cares'; 

func(CONST_A); //returns 'CONST_A' 
func($name); //returns '$name' 

函數不能知道這個。

我想,像查爾斯描述的閱讀源代碼可以讓你這個,但爲什麼?

+0

即使這樣,它可能也無法解決諸如'$ name = myFunc('hiThere');'之類的問題而不執行該文件。 換句話說,OP的問題幾乎是不可能的,絕對不可行,因爲性能受到影響,並且無法通過一些小的重構來解決......好的計劃應用程序絕不需要這種類型的東西。 – ShotgunToothpaste 2011-04-09 08:36:02