[PHP] Variablen oder Konstanten?

atlan428

Well-known member
ID: 43536
L
13 Mai 2006
269
10
Ich möchte mein Browsergame mehrsprachig gestalten. Dafür will ich für jede Sprache eine eigene Sprachdatei machen, die ich dann in mein Script include. Jetzt stellt sich aber die Frage, wie diese Sprachdatei aufgebaut sein soll. Dazu habe ich 2 Möglichkeiten:

1. Variablen
$lgHello = "Hallo";

2. Konstanten
define("lgHello", "Hallo");

Konstanten sollen ja viel weniger Speicher als Variablen verbrauchen. Mir persönlich kommt aber die Laufzeit wesentlich höher vor. Bei nachher ca. 1000+ Einträgen ist das schon ein ernstes Problem.

Welche der beiden Möglichkeiten würdet ihr hinsichtlich der Laufzeit und dem Speicherverbrauch empfehlen?
 
Also wenn du ein Browsergame machen willst, dann würde ich dir raten das der Übersicht halbe auf Templates aufzubauen. Dann hast du das Problem mit Variable oder Konstante nicht.

Ich selber arbeite eher ungerne mit Konstanten, aber wahrscheinlich sind sie für deinen Fall günstiger.... Wie aber schon gesagt wäre ein TemplateSystem um einiges effizienter und übersichtlicher.

Array hatte ich vergessen... flaschenkind hat schon recht, is durchaus auch zu überlegen.
 
Also Smarty macht deine Seite um Mikrosekunden langsamer, ich wette mit dir, deine Datenbank ist langsamer als Smarty ;) Und wenn selbst große Portale wie flickr und co Smarty verwenden, zeigt das, dass es nicht langsam ist oder?

atlan, vergiss diesen Test, das sind mit die unlogischsten Dinge die es gibt, Arrays haben gegenüber Konstanten große Vorteile, was machst du wenn du bei der Übersetzung von Deutsch nach Englisch, eine Konstante vergessen hast?
Pustekuchen das wars, nutzt du ein Array kannst du nachschauen ob der Wert im deutschen array vorkommt und diesen laden, dann hast du wenigstens schonmal keine Lücke.

Ich persönlich würde jedoch eher in Richtung gettext (kompliziert) oder XML (genial) gehen. Das Zend-Framework schlägt da noch ein paar andere Alternativen vor.

Solche Tests wie dein Link zeigen mir nur, dass die Leute keine Ahnung haben, sich um sowas Gedanken machen, was ein Mist.

Der Vorteil von Arrays zu Konstanten ist einfach ein dutzend mal höher.
 
atlan, vergiss diesen Test, das sind mit die unlogischsten Dinge die es gibt, Arrays haben gegenüber Konstanten große Vorteile, was machst du wenn du bei der Übersetzung von Deutsch nach Englisch, eine Konstante vergessen hast?
Pustekuchen das wars, nutzt du ein Array kannst du nachschauen ob der Wert im deutschen array vorkommt und diesen laden, dann hast du wenigstens schonmal keine Lücke.
Bei Konstanten gibt es auch keine Lücke. Du kannst nämlich auch überprüfen, ob eine Konstante gesetzt ist. Man ist dann immer noch auf dem gleichen Niveau wie bei Arrays. :LOL:
 
Bei Konstanten gibt es auch keine Lücke. Du kannst nämlich auch überprüfen, ob eine Konstante gesetzt ist. Man ist dann immer noch auf dem gleichen Niveau wie bei Arrays. :LOL:

Nope, nicht ganz. Bei Arrays lädst du einfach einen anderen Array, und kannst aus diesem dann den entsprechenden Text holen (bsp. Englisch, wenn dein deutscher Array ne Lücke hat). Konstanten kannst du nit neu laden, deswegen heißen sie Konstanten ;)
 
Nope, nicht ganz. Bei Arrays lädst du einfach einen anderen Array, und kannst aus diesem dann den entsprechenden Text holen (bsp. Englisch, wenn dein deutscher Array ne Lücke hat). Konstanten kannst du nit neu laden, deswegen heißen sie Konstanten ;)

wenn du sie aus einer db heraus definierst, könnten sie nicht definiert werden, wenn sie fehlen.. ist also auch ne frage der speicherung.
da es hier um verschiedene files per language geht, würde das selbe zutreffen.

ich bevorzuge aber auch arrays, schon alleine wegen der visuellen kategorisierung für den developer. also nen multi-array pro themenbereich.

xml ist hingegen für den fachanwender deutlich einfacher und transparenter zu pflegen.
 
Nope, nicht ganz. Bei Arrays lädst du einfach einen anderen Array, und kannst aus diesem dann den entsprechenden Text holen (bsp. Englisch, wenn dein deutscher Array ne Lücke hat). Konstanten kannst du nit neu laden, deswegen heißen sie Konstanten ;)

Klar kann man Konstanten laden. Du kannst sie nur nicht ändern (deswegen heißen sie Konstante). Aber wenn sie nicht vorhanden ist, versuchst du sie auch gar nicht wieder zu beschreiben. ;)
 
graccem das ist folgendermaßen gemeint:

er sucht ja ienen ansatz das er entweder zb die lang.german.php lädt oder die lang.english.php, und in diesen werden die sprachpakete definiert

Nun ist es natürlich quatsch erst die entsprechende Sprache zu laden und danach nochmal das andere Paket zu initialisieren für fehlende Übersetzungen, zumal man da auch nicht leicht erkennen kann, ob was fehlt.
Nehme ich arrayas kann ich einfach nen count machen und sehe das was nicht stimmt. Oder ich gehe die Keys durch und sehe das ich einen doppelt definiert habe ODER ich vergleiche die values on german und english und sehe gleich das ich da nur copy&paste gemacht habe und DAS geht nicht mit konstanten.

ich bleibe trotzdem bei XML, ist die deutlich schönere Methode, kann man schön per Hand machen, können Leute machen, die kein PHP können oder kann auch über nen Adminbereich gemacht werden, mit PHP-Arrays setzen ist es da deutlich komplexer.
 
Klar kann man Konstanten laden. Du kannst sie nur nicht ändern (deswegen heißen sie Konstante). Aber wenn sie nicht vorhanden ist, versuchst du sie auch gar nicht wieder zu beschreiben. ;)

Erstens schrieb ich neu laden, und zweitens hatte ich mir das Ganze so vorgestellt, dass er pro Sprache eine Datei macht, in der sämtliche Konstanten drinne stehen und er dann halt je nach bedarf die entsprechende Datei lädt. Und wenn du dann halt eine Lücke hast, müsstest du eine andere Datei laden, was zwar die Lücke der definierten Konstante füllt, aber für sämtliche anderen Konstanten, die ja bereits gesetzt sind, Fehler produziert.
Und ob das sinnvoll ist, möchte ich in Frage stellen.
 
Hat jemand von euch einen Beispiellink, wo steht wie man das ganze mit XML realisiert? Dann brauche ich mir nämlich jetzt nicht die Arbeit machen und alles weiter zu übersetzen. Es gibt mir Hauptsächlich um die Performance.
 
Och Atlan, Süßer, die Performance von der du da sprichst sind Millisekunden, schau dir lieber deine DB an, ich wette da kann man gut das 10fache an Geschwindigkeit rausholen.

Neija du restellst eine Klasse, die das XML parst und du diese zum translaten nimmst, oder du nutzt das fertig implementierte Zend_Translate des Zend Frameworks, nebenbei kannste dann auch noch alles auf das Zend Framework umstellen :biggrin:
 
Och Atlan, Süßer, die Performance von der du da sprichst sind Millisekunden, schau dir lieber deine DB an, ich wette da kann man gut das 10fache an Geschwindigkeit rausholen.

Neija du restellst eine Klasse, die das XML parst und du diese zum translaten nimmst, oder du nutzt das fertig implementierte Zend_Translate des Zend Frameworks, nebenbei kannste dann auch noch alles auf das Zend Framework umstellen :biggrin:

Aua... XML schön und gut, aber ohne Cache würde ich XML definitiv nicht zur lokalisierung von Webanwendungen nehmen. XML bringt ein beachtlichen Overhead mit im vergleich zum "nutzen". Da kommt man mit nem Array bei weitem besser weg ohne irgendwelche große nachteile zu haben. (vorallendingen der Array kann auch von ein opcode cache gehalten werden)
 
Ich denke mal Caching ist selbstverständlich, in jeder Anwendung sollte man soviel cachen wie möglich, das muss man ja nicht extra erwähnen
 
Und wenn du dann halt eine Lücke hast, müsstest du eine andere Datei laden, was zwar die Lücke der definierten Konstante füllt, aber für sämtliche anderen Konstanten, die ja bereits gesetzt sind, Fehler produziert.
Nicht wirklich, außer man setzt die Konstanten wie ein Anfänger. Hast wohl noch nie mit anderen Leuten an einem Projekt gearbeitet. Da musst man eben auch auf so etwas gefasst sein.


Nun ist es natürlich quatsch erst die entsprechende Sprache zu laden und danach nochmal das andere Paket zu initialisieren für fehlende Übersetzungen, [...]
Muss man bei Arrays ebenfalls machen. Oder hältst du immer alle Sprachen vor? 8O
Nehme ich arrayas kann ich einfach nen count machen und sehe das was nicht stimmt. Oder ich gehe die Keys durch und sehe das ich einen doppelt definiert habe ODER ich vergleiche die values on german und english und sehe gleich das ich da nur copy&paste gemacht habe und DAS geht nicht mit konstanten.
Stimmt, manches geht mit Konstanten nicht. Aber macht meiner Meinung nach auch keinen Sinn. Was möchtest du mit der Info anfangen, dass en=de ist? Dich damit täglich nerven, dass der Übersetzer immer noch nicht fertig ist? Sollte man nur machen, wenn man selber der Übersetzer ist.

ich bleibe trotzdem bei XML, ist die deutlich schönere Methode, kann man schön per Hand machen, können Leute machen, die kein PHP können oder kann auch über nen Adminbereich gemacht werden, mit PHP-Arrays setzen ist es da deutlich komplexer.
Ich habe nix gegen XML gesagt. Template können auch recht hilfreich sein, wenn da Leute ran sollen, die allenfalls von ML Ahnung ;)
 
Nicht wirklich, außer man setzt die Konstanten wie ein Anfänger. Hast wohl noch nie mit anderen Leuten an einem Projekt gearbeitet. Da musst man eben auch auf so etwas gefasst sein.

Wie setzt den ein Profi Konstanten? Lass mich raten "if(!defined(...)) define(...);" oder "@define(...);" :ugly: Macht sich natürlich besonders gut wenn mehrere Leute an einem Projekt arbeiten. So wird man wenigstens nicht mit blöden Fehlermeldungen belästigt wenns da schonmal nen Konstante mit dem selben Namen gab. Das der Wert am Ende anders als erwartet ist macht ja nix, Fehler suchen macht doch spaß. :wall:


Und zum Thema, wieso muss eigentlich zur Laufzeit geprüft werden ob alle Lokalisierungen vorhanden sind? Das kann man auch mit nem bissel Hirnschmalz anders lösen.
 
Wie setzt den ein Profi Konstanten? Lass mich raten "if(!defined(...)) define(...);" oder "@define(...);" :ugly: Macht sich natürlich besonders gut wenn mehrere Leute an einem Projekt arbeiten. So wird man wenigstens nicht mit blöden Fehlermeldungen belästigt wenns da schonmal nen Konstante mit dem selben Namen gab. Das der Wert am Ende anders als erwartet ist macht ja nix, Fehler suchen macht doch spaß. :wall:

Wofür kann man dann entsprechende Fehlerbehandlungen machen? Hat sogar den Vorteil, dass du selbst dann eine Fehlerinfo bekommen kannst, wenn der Server standardmäßig keinen Fehler ausgibt.
Ich sage nur, viel Spaß beim Fehler suchen. :LOL: