Mehrfaches "define"

Hallo,

in einer Anwendung, die ich erweitern soll, wird für jede Seite eine
Sprachdatei per include geladen, in der Konstanten für verschiedenen
Texte definiert sind:

define('HEADER', 'Mein Header');

Nun möchte ich eine Datenbankabfrage vorschalten, welche schaut für
welche Keys in der DB Texte vorhanden sind und diese dann per define setzt.
Ich möchte aber die jetzigen Sprachdateien als Fallback behalten, falls
in der DB mal nicht alle Schlüssel gefunden werden.

Geplant hab ich das so, dass ich zunächst alle in der DB vorhandenen
Schlüssel definiere und dann die Sprachdatei include... die dort
vorhandenen defines gehen ja für die bereits vorhandenen Konstanten ins
Leere, die noch nicht vorhandenen werden dann gesetzt.

Gibt es Gründe, ein doppeltes define der selben Konstante besser zu
unterlassen (Fehlermeldungen in Logs, etc.) oder kann man das so machen?
Hat jemand einen besseren Tip?

Gruß,
Jens
Jens Riedel [ Do, 27 September 2007 13:52 ] [ ID #1830931 ]

Re: Mehrfaches "define"

Ach ja: ich kenne natürlich die Möglichkeit, es so zu machen:

if(!defined('XYZ')) define('XYZ', 'abc');

Aber wenn es absolut o.k. ist, ein zweites (wirkungsloses) define zu
machen, würde ich das vorziehen, weil ich dann nicht zig Dateien
entsprechend erweitern muss...
Jens Riedel [ Do, 27 September 2007 14:01 ] [ ID #1830932 ]

Re: Mehrfaches "define"

Jens Riedel schrieb:

> Geplant hab ich das so, dass ich zunächst alle in der DB vorhandenen
> Schlüssel definiere und dann die Sprachdatei include... die dort
> vorhandenen defines gehen ja für die bereits vorhandenen Konstanten ins
> Leere, die noch nicht vorhandenen werden dann gesetzt.

Wenn du eine bereits definierte Konstante erneut definieren willst
kriegst du auf jeden Fall für jedes doppelte define() ne Notice.

Am saubersten ist, wenn du vor jedes (potentiell) doppelte define() eine
Abfrage mit defined() machst.

Gruß
Davi
David Fuhr [ Do, 27 September 2007 14:03 ] [ ID #1830933 ]

Re: Mehrfaches "define"

Jens Riedel schrieb:
> Ach ja: ich kenne natürlich die Möglichkeit, es so zu machen:
>
> if(!defined('XYZ')) define('XYZ', 'abc');

zu spät ^^

> Aber wenn es absolut o.k. ist, ein zweites (wirkungsloses) define zu
> machen, würde ich das vorziehen, weil ich dann nicht zig Dateien
> entsprechend erweitern muss...

Erzeugt halt die Notices und trägt nicht unbedingt zur Lesbarkeit des
Quelltextes bei, weil man wahrscheinlich, wenn man nur die eine Datei
ansieht, davon ausgeht, dass die defines auch funktionieren...

Gruß
David
David Fuhr [ Do, 27 September 2007 14:05 ] [ ID #1830935 ]

Re: Mehrfaches "define"

Jens Riedel meinte:

[snip]

> Gibt es Gründe, ein doppeltes define der selben Konstante besser zu
> unterlassen (Fehlermeldungen in Logs, etc.) oder kann man das so machen?

Ja, weil sauberes Programmieren was anderes ist, und Fehler bzw.
Warnings von denen man weiss, normalerweise ausbügelt.

> Hat jemand einen besseren Tip?

Handbuch?

http://at2.php.net/manual/en/function.get-defined-constants. php

Dazu eine einfache Schleife und sowas sollte sich sauber lösen lassen.
(Lt. Note erfasst die Funktion aber keine Klassenkonstanten.)

Gregor


--
http://www.gregorkofler.at ::: Landschafts- und Reisefotografie
http://www.licht-blick.at ::: Forum für Multivisionsvorträge
http://www.image2d.com ::: Bildagentur für den alpinen Raum
Gregor Kofler [ Do, 27 September 2007 14:04 ] [ ID #1830936 ]

Re: Mehrfaches "define"

Jens Riedel schrieb:

> Gibt es Gründe, ein doppeltes define der selben Konstante besser zu
> unterlassen (Fehlermeldungen in Logs, etc.) oder kann man das so machen=
?

Ja, es gibt Fehlermeldungen.

> Hat jemand einen besseren Tip?

if ( !defined( 'HEADER' ) ) define('HEADER', 'Mein Header');

MfG
Niels

--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Niels Braczek [ Do, 27 September 2007 14:09 ] [ ID #1830937 ]

Re: Mehrfaches "define"

Ok, überredet, dann setze ich halt in die Fallback-Dateien überall ein
if(!defined(...)) davor...
Dauert's halt 'ne halbe Stunde länger und ich muss dem Kunden 20 neue
Dateien schicken, aber seine Logs bleiben sauber...

Danke für eure Meinung!
Jens Riedel [ Do, 27 September 2007 14:27 ] [ ID #1830938 ]

Re: Mehrfaches "define"

Jens Riedel schrieb:
> Ok, überredet, dann setze ich halt in die Fallback-Dateien überall ein
> if(!defined(...)) davor...
> Dauert's halt 'ne halbe Stunde länger und ich muss dem Kunden 20 neue
> Dateien schicken, aber seine Logs bleiben sauber...
>
> Danke für eure Meinung!

Vielleicht solltest Du dazu übergehen, gleich mit E_ALL | E_STRICT zu
entwickeln. Dann stellen sich die Fragen nicht und die Chance ist höher,
das Dein Kunde mal ohne Heulkrämpfe auf PHP6 umsteigen kann.
Jonas Werres [ Do, 27 September 2007 15:34 ] [ ID #1830944 ]

Re: Mehrfaches "define"

Jens Riedel schrieb:
> Ok, überredet, dann setze ich halt in die Fallback-Dateien überall =
ein
> if(!defined(...)) davor...
> Dauert's halt 'ne halbe Stunde länger und ich muss dem Kunden 20 neue=

> Dateien schicken, aber seine Logs bleiben sauber...


Na die Config wird doch wohl an einer zentralen Stelle ausgelesen werden =

oder? An dieser Stelle wuerde ich auch den Fallback pruefen und
gegebenfalls ausfuehren.

Oder ist die Menge so gross das du perf. Probleme durch die ganzen
Fallbacks befuerchtest?

Gruss
Joerg

--
TakeNet GmbH, Geschaeftsfuehrer Wolfgang Meier
97080 Wuerzburg Tel: +49 931 903-2243
Alfred-Nobel-Straße 20 Fax: +49 931 903-3025
HRB Wuerzburg 6940 http://www.takenet.de
Joerg Behrens [ Fr, 28 September 2007 11:24 ] [ ID #1832837 ]
PHP » de.comp.lang.php.misc » Mehrfaches "define"

Vorheriges Thema: Strings mit Umlauten vergleichen (insb. array_search())
Nächstes Thema: foreach fuer mehrere Dimensionen