2013-01-23 41 views
2

是否可以在PHP中解析常量的內容?如何在PHP中解析常量

例如,

define('WHO_AM_I', 'My name is $_SESSION['who_am_i'].'); // setup the constant string 
echo eval(WHO_AM_I); // something like this -- but the eval() returns an error 

請注意,我不知道_SESSION var值,直到我真正的腳本流在以後的使用常量。

謝謝。

合理修正爲希望做到這一點

我想拉「硬編碼」我的劇本,讓用戶在自己的網站配置特定分類的能力。所以當我這樣做的時候,我也想創建一個準動態常量,我想我可能在後面的腳本中解析這個常量。

如果無法完成...那麼它無法完成。

不要開槍問我這個問題。

最後的評論,以避免一切這種混亂

我的問題的目的,無關與eval()函數。我真的很後悔把它放在那裏首先。

我把eval()放在問題中,僅僅是爲了展示給stackoverflow成員,如果我在問題上做了一些準備工作,而不是問一個開放式的問題 - 嘿,給我一個解決方案,而沒有提供任何刺。所以請忽略eval()。

我想知道的是我可以以某種方式製作一個define()方法,以便在我的腳本中稍後分配值。就是這樣,就是這樣。

修訂ç

我知道我可以做以下雖然我不想做這種方式:

define('PARSE_ABLE_CONSTANT_PART_A', 'My name is '); 
define('PARSE_ABLE_CONSTANT_PART_B', '.'); 

...後來下來腳本路...

echo PARSE_ABLE_CONSTANT_PART_A . $_SESSION['who_am_i'] . PARSE_ABLE_CONSTANT_PART_B; 

我只是不想這樣做,如果我可以讓它在常量中使用嵌入式var變得更加輕鬆。

+4

只是不討好。你究竟在做什麼?即使在horrid'eval()之前,你也有一個語法錯誤。 – PeeHaa

+0

當你說「eval()返回錯誤」時會發生什麼錯誤? – Vulcan

+0

你爲什麼使用eval?你想完成什麼? 'define'('WHO_AM_I','我的名字是$ _SESSION ['who_am_i']。 ]);' –

回答

1

根據定義,常量不允許您使用動態內容進行設置。

下面是PHP手冊中報價:

As the name suggests, that value cannot change during the execution of the script

您可以通過here

你可能會想的magical constants

+1

這是不正確的;常量可以在運行時使用['define'](http://php.net/define)來定義。 – Vulcan

+1

是的,我完全瞭解@ pzirkind的不變範圍。只是問是否有一些聰明的方法來「解析」一個常數...... –

+0

@ H.Ferrence嗯,有趣。你爲什麼不想用常規變量來保存它們?試圖更好地理解 – pzirkind

2

這似乎真的有鬼見多了,其他用戶有指出。如果你願意,你可以這樣做:

define('WHO_AM_I', 'echo \'My name is \'.$_SESSION[\'who_am_i\'];'); 
eval(WHO_AM_I); 

這將始終只是回顯變量。你需要評估一個表達式afaik。

只要閱讀您的編輯。我認爲你會更適合使用.ini文件,或者是一個靜態屬性的靜態類。使它更加靈活,並避免評估。您正在從我所能看到的用戶生成的內容中進行討論 - 將其用於eval調用似乎非常不安全。

靜態類的一個簡單的例子,你可以使用:

<?php 
class myConstants{ 
    public static function _($key){ 
    switch($key){ 
     case "WHO_AM_I": 
     return "My name is ".$_SESSION['who_am_i']; 
     break; 
     case "OTHER_CONSTANT": 
     // does some other evaluation and returns a string 
     break; 
    } 
    throw new Exception("Constant isn't defined"); 
    } 
} 
?> 

然後,你可以echo myConstants::_('WHO_AM_I');

+0

我製作了[類似的例子](http://codepad.org/akcIeekZ)。但無論如何,作爲一個經驗法則,如果您認爲您需要使用'eval()',那麼您不需要 - 幾乎總是有一個更好的方法。 –

+0

我不確定你爲什麼認爲我的問題是「可疑」@EsbenTind。我在想,我在問一個非常非常簡單的基本問題 - 「你可以創建一個常量,使它包含一個嵌入變量,以後可以在腳本中解析這個變量嗎?」這就是我所要求和尋找的。 –

+0

然後沒有。常量只有在您定義它時纔會被解析。我認爲你有一個使用eval的理由(即你以後改變你的會話,並希望你的常數反映新的價值)。如果不是這種情況,只要執行'define('WHO_AM_I','我的名字是'。$ session ['who_am_i']。'。');'。具有靜態屬性/方法的類也可以在全局和本地範圍中訪問。這些也可以在你打電話時進行編譯。因此我爲什麼提出這個解決方案 –