Diddi: Wo befindet sich meine php-Anwendung gerade

Hallo

ich habe folgende Konfiguration

meineDomain.de/dir1/index.php

und

meineDomain.de/dir2/index.php

In beiden Versionen soll eine Datei mit include eingebunden werden. Da diese größere Datei zu 95% für beide Aufrufe passt. würde ich die Unterschiede gerne in der Include-Datei mittels einer PHP-Abfrage realisieren.

Wie aber weiß ich in der Include-Datei ob ich im dir1 oder dir2 bin?

  1. Kommt darauf an, was Du genau willst.

    1. $_SERVER['DOCUMENT_ROOT'] = Verzeichnis, in welchem Deine Domain liegt.
    2. $_SERVER['PWD'] = Verzeichnis, in welchem das per Request aufgerufene Skript liegt.
    3. __DIR__ = Magische Konstante, die Dir sagt, in welchem Verzeichnis das gerade abgearbeitete Skript liegt, auch wenn es includiert wurde.

    https://www.php.net/manual/en/reserved.variables.server.php https://www.php.net/manual/de/language.constants.magic.php

    Ich tippe zwar auf Nr. 2, aber vielleicht willst Du auch das hier:

    <?php
    define ( 
        'RelDirToDocumentRoot',
        substr(
           $_SERVER['PWD'],
           strlen( $_SERVER['DOCUMENT_ROOT'] ),
           NULL
        )
    );
    
    echo ( RelDirToDocumentRoot . "\n" );
    
    

    sollte etwas wie „dir1/“ liefern, wenn Du Dein Skript in „MeineDomain/dir1/" startest.

  2. Liebe(r) Diddi,

    in Ergänzung zu dem, was @Raketenwilli bereits geschrieben hat, kannst Du auch in $_SERVER['PHP_SELF'] schauen. Dort findest Du den Pfad aus der URL, mit der das jeweilige index.php aufgerufen wurde.

    Referenz mit den jeweiligen Array-Indizes von $_SERVER (auf deutsch)

    Liebe Grüße

    Felix Riesterer

  3. Hallo Diddi,

    Es gibt viele Ansätze zur Lösung, aber ICH würde Programmlogik niemals an den Ort der Installation koppeln. Das ist eine extrem zerbrechliche Konstruktion.

    Wenn die Anwendung in dir1 vom include ein bestimmtes Verhalten verlangt und die Anwendung in dir2 ein anderes, dann ist es wichtig, dass das in diesen beiden Anwendungen explizit gemacht wird. Auf welche Weise auch immer. Code, der auf magische Weise „das richtige“ tut, wird dein älteres Ich zum Kotzen bringen. Im Strahl.

    Die primitivste Form ist eine globale Variable. Deren Name sollte zum Namen der inkludierten Datei einen Bezug haben. Setze sie in dir1 vor dem include auf 1 und in dir2 auf 2. Füge an beiden Stellen einen Kommentar hinzu, was das soll. Frage im include die Variable geeignet ab. Dokumentiere diese Variable, beschreibe die erlaubten Werte und beschreibe die Verhaltensunterschiede. Entweder zu Beginn der Include-Datei oder in der Moduldoku zum Include. Aber dokumentiere es.

    Ich will das nicht als beste Lösung empfehlen. Es ist primitiv, und je nach Inhalt des include vielleicht die einzige vernünftige Möglichkeit.

    Empfehlen möchte ich dies hier: Laut PSR-1 soll eine PHP Datei entweder etwas tun ("cause side effects") oder etwas deklarieren (Konstanten, Funktionen, Klassen, …). Mischformen sind untersagt. Wenn du also grundlegende Code-Standards einhalten willst, dann darf deine include-Datei nur Klassen oder Funktionen definieren und nicht eigenständig Code ausführen. Die Ausführung muss durch einen Funktions- oder Methodenaufruf im inkludierenden Script angestoßen werden.

    Und hier wird es spannend: an dieser Stelle kannst du per Parameter steuern, was passieren soll. Oder du gliederst den Inhalt des Include sinnvoll in Funktionen und rufst sie in dir1 und dir2 unterschiedlich kombiniert auf. Wie man das in deinem Fall am besten macht, kann man ohne genauere Codekenntnis nicht sagen. Aber das ist der Weg zu wartbarem und verstehbarem Code.

    Rolf

    --
    sumpsi - posui - obstruxi