PHP Warning: Constant myheader already defined in ...
Jörg
- php
0 Auge0 Raketenwilli0 Felix Riesterer0 Raketenwilli0 Rolf B
1 Rolf B0 Jörg
Hallo,
wenn ich in einer Konfiguration eine Konstante definiere:
define ( 'myheader', 'hier dann bla blub' );
und ich das in dieser Datei nur 1 x definiert habe, aber im Errorlog dann
PHP Warning: Constant myheader already defined in ...
finde, dann vermute ich, dass eines der Scripte diese Konfiguration includet, obwohl sie schon includiert war.
Eigentlich include ich sie aber immer mit include_once().
Habe ich eine Chance, herauszufinden, wio ich das ggf. übersehen habe und sie per include() einbinde?
Oder gibt es noch eine andere Möglichkeit, warum ich das Warning erhalte?
Jörg
Hallo
wenn ich in einer Konfiguration eine Konstante definiere:
define ( 'myheader', 'hier dann bla blub' );
und ich das in dieser Datei nur 1 x definiert habe, aber im Errorlog dann
PHP Warning: Constant myheader already defined in ...
finde, dann vermute ich, dass eines der Scripte diese Konfiguration includet, obwohl sie schon includiert war.
Eigentlich include ich sie aber immer mit include_once().
Habe ich eine Chance, herauszufinden, wio ich das ggf. übersehen habe und sie per include() einbinde?
Die Stelle, an der die Konstante schon zuvor definiert wurde, sollte in der Warnmeldung an Stelle von „…“ stehn.
Dabei ist es unerheblich, ob du ein Skript per include
, include_once
, require
oder require_once
einbindest. Alles, was du auf welchem Wege immer einbindst, ist ab diesem Moment Bestandteil des einbindenden Hauptskripts. Wenn in einem der beteiligten Skripte eine Konstante definiert wurde, ist sie definiert. Somit kann sie nicht noch einmal definiert werden.
Oder gibt es noch eine andere Möglichkeit, warum ich das Warning erhalte?
Nein. Die Wanrung erscheint, weil die zu definierende Konstante bereits existiert. That's it.
Tschö, Auge
Habe ich eine Chance, herauszufinden, wio ich das ggf. übersehen habe und sie per include() einbinde?
cd $ProjectDir
grep -Rn -P 'include[^_]|require[^_]' *
Durchsucht alle Dateien, auch in Unterverzeichnissen, nach 'include' oder 'require' ohne nachfolgenden Unterstrich und gibt den Dateiname, die Zeile und die Fundstelle aus.
Lieber Jörg,
nur als Ergänzung:
define ( 'myheader', 'hier dann bla blub' );
es gibt da eine Konvention, nach der die Namen von Konstanten immer GROSSGESCHRIEBEN werden. Das muss man nicht berücksichtigen...
Liebe Grüße
Felix Riesterer
Lieber Jörg,
nur als Ergänzung:
define ( 'myheader', 'hier dann bla blub' );
es gibt da eine Konvention, nach der die Namen von Konstanten immer GROSSGESCHRIEBEN werden. Das muss man nicht berücksichtigen...
Es gibt jede Menge Konventionen. Auch die (unterhalb der ungarischen Notation), der gemäß GROSSGESCHRIEBENE Konstanten und Variablen für PHP und dessen mitgelieferte Bibliotheken reserviert sind und eigene Namen für alles Benambare stets CamelCase notiert werden um den Namenskonflikten von Anfang an aus dem Weg zu gehen. Zudem sind Namespaces zu nutzen.
Variablen erkennt man in PHP übrigens sehr gut am $
und Funktionen am '()'…
Hallo Raketenwilli,
es ist guter Brauch in PHP, definierte Konstanten in GROẞBUCHSTABEN zu schreiben. Alle von PHP mitgelieferten Konstanten halten sich daran - man kann das also für PHP als idiomatisch ansehen.
Allerdings stimme ich Dir insofern bei, dass es keinen PSR gibt, der das verlangt. Ich finde zumindest keinen. Und im PHP Manual finde ich gerade auch nicht.
Rolf
Hallo Jörg,
es gibt die Funktion debug_backtrace(), die auch Includes berücksichtigt - äh, ok, ich schreibe hier von StackOverflow ab, also: die es berücksichtigen sollte.
Dies
$caller = debug_backtrace()[0];
echo "I was included from $caller[file]:$caller[line]";
vor dem define() sollte Dir ausgeben, welche Datei das include bestellt hat und dann weißt Du, wo Du suchen musst.
Danach schmeißt Du das wieder 'raus - das ist nichts für den Produktivbetrieb.
Oder Du greppelst Dich durch, das liefert Dir aber nicht unbedingt Informationen zum dynamischen Verhalten der Anwendung.
Rolf
Danke an alle für die Antworten.
Hat mir geholfen.
Jörg