【问题标题】:Undefine PHP defines?取消定义 PHP 定义?
【发布时间】:2012-04-04 13:24:12
【问题描述】:

我正在努力将基于 define() 的旧语言/翻译系统转换为更灵活的系统(可能基于 JSON,但它仍然是开放的)。

作为此转换的一部分,我需要将 42 个包含数千个字符串的 .php 文件转换为我将使用的任何格式。一些定义的字符串引用其他定义或使用 PHP 代码。我不需要保持这种动态行为(无论如何它从来都不是真正的动态),但我需要在转换时拥有“当前”值。 一个定义可能如下所示:

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

由于所有定义都有一个易于识别的“LNG_”前缀,因此转换单个文件很简单。但我想制作一个小脚本,一次处理所有 42 个。

理想情况下,我可以取消定义或重新定义define(),但我找不到一种简单的方法来做到这一点。这有可能吗?

或者,处理这种转换的好方法是什么?该脚本将是一次性的,因此它不需要可维护或快速。我只是希望它完全自动化以避免人为错误。

【问题讨论】:

  • 因为 define 定义了一个常量,根据定义 - 你不能 undefine 它,因为它不是一个常量 - 它是一个变量。 PHP 有其变量表示法以及与变量一起使用的所有其他内容。长话短说,你显然不需要常量,你需要数组来实现这个多语言特性。
  • @N.B.我正在努力做到这一点。我不想要常数。问题是从常量到数组/do/json/ini/whatever 的一次性转换。

标签: php translation redefine


【解决方案1】:

如果速度不重要,那么你可以使用 get_defined_constants 函数。

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

$myconst 将包含脚本定义的所有常量:-)
P.S:我不是一个好的 php 编码器,这只是一个建议:-)

【讨论】:

  • 感谢您和 Leonard Challis,我设法通过使用 get_defined_constants() 和 array_diff() 比较包含每个单独文件之前和之后的常量来解决这个问题。
【解决方案2】:

您不能取消定义常量,但您可以通过使用它们和 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);
}
?>

【讨论】:

    【解决方案3】:

    定义的常量不能是未定义的。它们是不可变的。

    也许你可以做的是在它们被定义之前就进入并在某些情况下修改它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 2012-01-17
      • 1970-01-01
      相关资源
      最近更新 更多