Jörg: PHP Warning: Constant myheader already defined in ...

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

  1. 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

    --
    200 ist das neue 35.
  2. 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.

    grep gibt es auf für Windows.

  3. 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

    1. 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 '()'…

      1. 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

        --
        sumpsi - posui - obstruxi
  4. 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

    --
    sumpsi - posui - obstruxi
  5. Danke an alle für die Antworten.

    Hat mir geholfen.

    Jörg