我正在努力将旧的基于define()的语言/翻译系统转换为更灵活的语言/翻译系统(可能是基于JSON的,但它仍然是开放的。)
作为此转换的一部分,我需要将每个数千个字符串的42个.php文件转换为我将使用的任何格式。一些定义的字符串引用其他定义或使用PHP代码。我不需要保持这种动态行为(它永远不会真正动态),但我需要在转换时获得“当前”值。 一个定义可能如下所示:
define('LNG_Some_string', 'Page $s of $s of our fine '.LNG_Product_name);
由于所有定义都具有易于识别的“LNG_”前缀,因此转换单个文件非常简单。但我想制作一个小型脚本,一次性处理所有42个。
理想情况下,我可以取消定义或重新定义define(),但我找不到一种简单的方法。这有可能吗?
或者,处理此转换的好方法是什么?该脚本将是一次性的,因此它不需要是可维护的或快速的。我只是希望它完全自动化以避免人为错误。
答案 0 :(得分:2)
如果速度不重要,那么你可以使用get_defined_constants函数。
$constans = get_defined_constants(true);
$myconst = array();
$myconst = $constans['user'];
$myconst
将包含脚本定义的所有常量:-)
P.S:我不是一个好的php编码器,它只是一个建议: - )
答案 1 :(得分:1)
你不能取消定义常量,但你可以通过利用它们和constant()函数来生成新的脚本:
<?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);
}
?>
答案 2 :(得分:0)
定义的常量不能是未定义的。他们是不变的。
也许您可以做的就是在定义之前立即进入并在某些情况下修改它们。