2012-04-04 10 views
1

私は古いdefine()ベースの言語/翻訳システムをより柔軟なもの(おそらくJSONベースですが、まだ開いています)に変換しようとしています。PHP定義の定義を解除しますか?

この変換の一部として、使用するフォーマットに数千の文字列を持つ42個の.phpファイルを変換する必要があります。定義された文字列の中には、他のものを参照するものやPHPコードを使用するものがあります私はこの動的な振る舞いを維持する必要はありませんが(それは決して実際はダイナミックではありません)、私は変換時に「現在の」値を持つ必要があります。すべての定義は容易に認識「LNG_」プレフィックスを持っているので

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

、単一のファイルを変換することは簡単です: 一つは、次のようになります定義します。しかし、私は1つの実行ですべての42を処理する小さなスクリプトを作成したいと思います。

理想的には、define()の定義を解除するか再定義することができますが、簡単な方法はありません。これはすべて可能ですか?

また、この変換を処理するにはどうすればよいでしょうか?スクリプトは一度限りなので、保守性や高速性は必要ありません。人間のエラーを避けるために完全に自動化したいだけです。

+1

:-)ただの提案でした定義によると、それは定数ではないので、あなたはそれを 'undefine 'できません - それは変数です。 PHPには可変表記法があり、変数の扱いにはそれ以外のものがあります。長い話をすると、明らかに定数は必要ありません。この多言語機能を実行するには配列が必要です。 –

+0

@ N.B。私はそれを正確にやろうとしています。私は定数を望んでいません。問題は、定数からarray/do/json/ini/whateverへの1回の変換です。 – Martijn

答えて

2

あなたはは、get_defined_constantsの機能を使用できるようにスピードが、重要でない場合。

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

$myconst
PS :-)スクリプトで定義されたすべての定数が含まれます:define`は定数を定義し `ているので、私は良いPHPのコーダーないんだけど、それは

+0

あなたとLeonard Challisのおかげで、私はget_defined_constants()とarray_diff()を使ってそれぞれのファイルをインクルードする前後の定数を比較することで解決しました。 – Martijn

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); 
} 
?> 
関連する問題