2012-04-04 4 views
1

Ich arbeite daran, ein altes define() - basiertes Sprach-/Übersetzungssystem in ein flexibleres zu konvertieren (wahrscheinlich JSON-basiert, aber immer noch offen).Definiere PHP definiert?

Als Teil dieser Konvertierung muss ich von 42.php-Dateien mit mehreren tausend Strings in jedes Format konvertieren, das ich verwenden werde. Einige der definierten Strings verweisen auf andere Definitionen oder verwenden PHP-Code. Ich muss dieses dynamische Verhalten nicht beibehalten (es ist sowieso nie wirklich dynamisch), aber ich muss die "aktuellen" Werte zum Zeitpunkt der Konvertierung haben. One definieren könnte wie folgt aussehen:

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

Da alle definiert haben einen leicht erkennbaren ‚LNG_‘ Präfix, eine einzelne Datei konvertiert trivial ist. Aber ich möchte ein kleines Skript machen, das alle 42 in einem Lauf behandelt.

Idealerweise wäre ich in der Lage, define() 's entweder zu deefinieren oder neu zu definieren, aber ich finde keinen einfachen Weg, dies zu tun. Ist das überhaupt möglich?

Alternativ, was wäre eine gute Möglichkeit, diese Konvertierung zu handhaben? Das Skript wird einmalig sein, also muss es nicht wartbar oder schnell sein. Ich möchte nur, dass es vollständig automatisiert ist, um menschliche Fehler zu vermeiden.

+1

Seit 'define' eine Konstante definiert per definitionem - du kannst es nicht "aufheben", weil es dann keine Konstante ist - es ist eine Variable. Und PHP hat seine variable Notation und alles andere, was mit der Arbeit mit Variablen zu tun hat. Lange Rede kurzer Sinn, Sie brauchen anscheinend keine Konstanten, Sie brauchen Arrays, um diese mehrsprachige Funktion auszuführen. –

+0

@ N.B. Ich versuche genau das zu tun. Ich will keine Konstanten. Das Problem ist die einmalige Konvertierung von Konstanten in Array/do/json/ini/was auch immer. – Martijn

Antwort

2

wenn die Geschwindigkeit nicht wichtig ist, so dass Sie get_defined_constants Funktion nutzen zu können.

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

$myconst werden alle Konstanten von Ihrem Skript :-)
PS definiert enthalten: Ich bin kein guter PHP-Coder, es war nur ein Vorschlag :-)

+0

Dank Ihnen und Leonard Challis, habe ich es gelöst, indem ich die Konstanten vor und nach dem Einfügen jeder einzelnen Datei mit get_defined_constants() und array_diff() verglichen habe. – Martijn

0

Definierte Konstanten können nicht undefiniert sein. Sie sind unveränderlich.

Vielleicht, was Sie tun können, ist in direkt, bevor sie definiert sind und ändern sie unter bestimmten Umständen.

1

Sie können keine Konstanten undefine, aber Sie können von utiliising sie und die Konstante() Funktion, um Ihre neue Skripte generieren:

<?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); 
} 
?>