PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Formatierungs-Strings mit dynamischer Anzahl von Argumenten



CaptainAlphabet
17-12-2007, 17:55
Guten Abend!

Ich arbeite gerade an einer Funktion zur Ausgabe von Meldungen an den User, die teilweise um Informationen aus einem an die Funktion übergebenen Objekt ergänzt werden. Die momentan fest in die Funktion eingebauten Meldungen würde ich gerne auslagern, sodass man theoretisch auch ganz leicht andere Sprachen verwenden könnte, ohne die Funktion abändern zu müssen.

Aktuelle Umsetzung in vereinfachter Form dargestellt:

function getMessage($code, $obj = null)
{
switch ($code)
{
case 'inuse': $msg = "{$obj->label} ist bereits vergeben."; break;
case 'login': $msg = "Login fehlgeschlagen."; break;
case 'maxlength': $msg = "{$obj->label} darf maximal {$obj->maxlength} Zeichen lang sein."; break;
}
return $msg;
}

Nun habe ich mir überlegt, die Meldungen außerhalb der Funktion als Formatierungs-Strings zu definieren. Da die Meldungen aber unterschiedliche und unterschiedlich viele Eigenschaften des übergebenen Objekts abrufen, kann ich keine festgelegten Argumente an die Funktion sprintf() übergeben.

Überlegter Lösungsansatz, der aber ein Problem mit sich bringt:

define(MSG_IN_USE, "%s ist bereits vergeben.");
define(MSG_LOGIN_FAILED, "Login fehlgeschlagen.");
define(MSG_MAX_LENGTH, "%s darf maximal %u Zeichen lang sein.");

function getMessage($code, $obj = null)
{
switch ($code)
{
case 'inuse': $msg = MSG_IN_USE; break;
case 'login': $msg = MSG_LOGIN_FAILED; break;
case 'maxlength': $msg = MSG_MAX_LENGTH; break;
}
return sprintf($msg, $obj->var_1, $obj->var_2, $obj->var_n);
}

Gibt es für diesen Ansatz eine brauchbare Lösung oder sollte ich hier doch mit den Meldungs-Strings aus der ersten Variante arbeiten und diese durch eine eval()-Funktion schicken?

Mit freundlichen Grüßen

CaptainAlphabet

jan61
17-12-2007, 18:48
Moin,

Du willst also internationalisieren/lokalisieren? Da ist es eher üblich, die in vielen Programmiersprachen vorhandenen gettext-Mechanismen zu nutzen. Schau Dir mal http://de.php.net/gettext an.

Jan

CaptainAlphabet
17-12-2007, 21:45
Du willst also internationalisieren/lokalisieren?
Eigentlich diente dieses Beispiel nur der Veranschaulichung dessen, dass die momentane Umsetzung einfach unflexibel ist. ;)

Trotzdem danke ich dir für den Link. Leider ist gettext aber nicht das, was ich suche. Es geht mir schon darum, Strings Variablen zu übergeben, unabhängig davon, wie viele.

jan61
17-12-2007, 22:44
Eigentlich diente dieses Beispiel nur der Veranschaulichung dessen, dass die momentane Umsetzung einfach unflexibel ist. ;)...

Hmm - ich will ja nicht klugscheissern, aber ich habe einfach mal die allwissende Müllhalde gefragt. Auf meine Frage "php +varargs" hat Google mir 38.000 Treffer ausgespuckt, der erste war: http://de3.php.net/func_get_arg. Passt das?

Jan

CaptainAlphabet
17-12-2007, 23:36
Das bringt in diesem Fall nichts, weil die Funktion immer nur zwei Argumente erhält, nämlich einen Code und ein optionales Objekt. Nur die Objekteigenschaften, die sich die Meldungen rauspicken, sind jedes Mal anders.

jan61
17-12-2007, 23:40
Das bringt in diesem Fall nichts, weil die Funktion immer nur zwei Argumente erhält, nämlich einen Code und ein optionales Objekt. Nur die Objekteigenschaften, die sich die Meldungen rauspicken, sind jedes Mal anders.

Dann bleibt Dir wohl nur 1 Möglichkeit: Einen eigenen Parser schreiben.

Jan

CaptainAlphabet
18-12-2007, 10:39
Ach, ich denke, ich werde die Strings mit den Variablenaufrufen an eine eval()-Funktion übergeben. Das wird das Einfachste sein.

Danke für deine Zeit und lass es dir gutgehen! :)