2012-04-04 176 views
1

我工作在一箇舊定義()轉換 - 基於語言/翻譯系統,以更靈活的一個(很可能是JSON爲基礎的,但它仍然是開放的)。未定義的PHP定義?

由於這種轉換的一部分,我需要從42個.php文件轉換與幾千串每到任何格式,我將使用。一些定義的字符串引用其他定義或使用PHP代碼。我不需要保持這種動態行爲(反正它從來都不是真正的動態行爲),但我需要在轉換時獲得「當前」值。 一個定義可能是這樣的:

define('LNG_Some_string', 'Page $s of $s of our fine '.LNG_Product_name); 

因爲所有的定義有一個容易識別的「LNG_」前綴,將一個單一的文件實在是微不足道。但是我想製作一個小腳本,它可以在一次運行中處理所有42個腳本。

理想我能夠要麼取消定義或重新定義的定義()的,但我不能找到這樣做的一個簡單的方法。這是可能嗎?

或者,這將是處理這種轉換的好方法?該腳本將是一次性的,所以它不需要維護或快速。我只是希望它完全自動化以避免人爲錯誤。

+1

建議由於'define'定義爲恆定,根據定義 - 你不能「定義」它,因爲它不是一個常數 - 它是一個變量。 PHP有它的變量符號和其他所有與變量一起工作的符號。長話短說,你顯然不需要常量,你需要數組來執行這種多語言功能。 – 2012-04-04 13:30:50

+0

@ N.B。我正在努力做到這一點。我不想要常量。問題是從常量到array/do/json/ini/whatever的一次性轉換。 – Martijn 2012-04-04 13:51:43

回答

2

如果速度並不重要,這樣你就可以用get_defined_constants功能。

$constans = get_defined_constants(true); 
$myconst = array(); 
$myconst = $constans['user']; 

$myconst將包含腳本所定義的所有常量:-)
PS:我不是一個好的PHP的編碼器,它只是:-)

+0

感謝你和Leonard Challis,我設法通過比較包含使用get_defined_constants()和array_diff()的每個單獨文件之前和之後的常量來解決它。 – Martijn 2012-04-05 07:06:15

0

定義的常量不能是不確定的。它們是不可變的。

也許你可以做的就是右在定義前,他們並修改它們在某些情況下。

1

無法取消定義的常量,但是你可以通過utiliising他們和常數()函數生成新的腳本:

<?php 
/* presuming all the .php files are in the same directoy */ 
foreach (glob('/path/*.php') as $file) { 
    $contents = file_get_contents($file); 
    $matches = array(); 
    if (!preg_match('/define\(\'LNG_(\w+)\'/', $contents, $matches) { 
    echo 'No defines found.'; 
    exit; 
    } 

    $newContents = ''; 
    include_once $file; 
    foreach ($matches as $match) { 
    $newContents .= "SOME OUTPUT USING $match AS NAME AND " . constant($match) . " TO GET VALUE"; 
    } 
    file_put_contents('new_'.$file, $newContents); 
} 
?>