1

古い define() ベースの言語/翻訳システムをより柔軟なシステム (おそらく JSON ベースですが、まだオープンです) に変換する作業を行っています。

この変換の一環として、それぞれ数千の文字列を含む 42 個の .php ファイルを、使用する形式に変換する必要があります。定義された文字列の一部は、他の定義を参照したり、PHP コードを使用したりします。この動的な動作を維持する必要はありません (実際に動的になることは決してありません) が、変換時に「現在の」値が必要になります。1 つの定義は次のようになります。

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

すべての定義には簡単に認識できる「LNG_」プレフィックスが付いているため、1 つのファイルを変換するのは簡単です。しかし、1 回の実行で 42 個すべてを処理する小さなスクリプトを作成したいと思います。

define() を定義解除または再定義できるのが理想ですが、それを行う簡単な方法が見つかりません。これはまったく可能ですか?

あるいは、この変換を処理する良い方法は何でしょうか? スクリプトは 1 回限りのものであるため、保守可能または高速である必要はありません。人的ミスを避けるために完全に自動化したいだけです。

4

3 に答える 3

2

速度が重要でない場合は、get_defined_constants 関数を使用できます。

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

$myconstスクリプトで定義されたすべての定数が含まれます:-)
PS: 私は良い PHP コーダーではありません。

于 2012-04-04T13:44:35.317 に答える
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);
}
?>
于 2012-04-04T13:38:30.923 に答える
0

定義済みの定数を未定義にすることはできません。それらは不変です。

おそらくできることは、それらが定義される直前に入って、特定の状況でそれらを変更することです。

于 2012-04-04T13:33:58.027 に答える