shevegen: several PHP include() ' s

Hallo,

Datei A.php inkludiert Datei B.php.
Datei B.php soll wiederum eine weitere Datei C.php inkludieren, wobei dieses include über eine Funktion aufgerufen wird. Diese Funktion wird ziemlich gleich zu Beginn in Datei A mit einem Parameter aufgerufen.

Datei C.php enthält nun einige Variablen, die ich in Datei A.php
mittels echo $foo ausgeben möchte. Allerdings scheint Datei A.php diese Variablen gar nicht zu kennen, vielleicht weil die include Direktive über den Funktionsaufruf erst nach den echo $foo Code aufgerufen wird.

Um mein Problem anders zu umschreiben, ich möchte mehrere Standard php Dateien aufrufen, die in verschiedenen Directories liegen. Nur möchte ich mir so viel an manueller Tip-Arbeit als irgendwie möglich ersparen. Hat wer eine gute Idee dazu?

Mein Gedanke war das ich in jedem directory eine kleine standard php Datei definiere, mit Variablen, Funktionen etc.. die für die Dateien im aktuellen Verzeichnis zu nutzen sind, und bei Bedarf von dieser standard php auf andere, in verstreuten Verzeichnis liegenden weiteren standard php Dateien zugreife (bei Bedarf) sofern ich bestimmte Funktionen aufrufe.

  1. hi,

    Datei C.php enthält nun einige Variablen, die ich in Datei A.php
    mittels echo $foo ausgeben möchte. Allerdings scheint Datei A.php diese Variablen gar nicht zu kennen, vielleicht weil die include Direktive über den Funktionsaufruf erst nach den echo $foo Code aufgerufen wird.

    nicht vielleicht, sondern ziemlich sicher.
    ist doch wohl auch logisch, oder?

    aber wer oder was hindert dich denn daran, den include vor dem zugriff auf die variablen zu machen?

    gruß,
    wahsaga

    --
    "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
  2. Hallo !

    Hallo,

    Datei A.php inkludiert Datei B.php.
    Datei B.php soll wiederum eine weitere Datei C.php inkludieren, wobei dieses include über eine Funktion aufgerufen wird. Diese Funktion wird ziemlich gleich zu Beginn in Datei A mit einem Parameter aufgerufen.

    Datei C.php enthält nun einige Variablen, die ich in Datei A.php
    mittels echo $foo ausgeben möchte. Allerdings scheint Datei A.php diese Variablen gar nicht zu kennen, vielleicht weil die include Direktive über den Funktionsaufruf erst nach den echo $foo Code aufgerufen wird.

    also A.php:
    include("B.php");
    b_load("C");
    echo $foo;

    B.php:
    function b_load($file) {
      include($file)
    }

    Dann geht
    C.php:
    $bla = "blubb";
    $foo = "bar";
    logischerweise nicht, da die Variablen im Kontext der Funktion b_load definiert werden, und nicht global.

    C.php:
    $GLOBALS["foo"]="bar";
    $GLOBALS["bla"]="blubb";
    sollte dagegen Funktionieren,
    $CLOBALS["config"] = Array(
    "foo"=>"bar",
    "bla"=>"blubb"
    );
    ist evtl. einfacher zu schreiben, allerdings muss man dann auch mit echo $config["foo"] zugreifen.

    Alexander

  3. Moin!

    ... include über eine Funktion aufgerufen ...
    ... scheint Datei A.php diese Variablen gar nicht zu kennen...

    Sagt dir der Begriff "scope" etwas, so im Sinne von "lokal" und "global"?

    Deine Variablen werden lokal in der Funktion definiert, stehen deshalb nur innerhalb der Funktion lokal zur Verfügung, aber nicht global.

    - Sven Rautenberg

  4. Hallo shevegen!

    Datei A.php inkludiert Datei B.php.
    Datei B.php soll wiederum eine weitere Datei C.php inkludieren, wobei dieses include
    über eine Funktion aufgerufen wird. Diese Funktion wird ziemlich gleich zu Beginn in
    Datei A mit einem Parameter aufgerufen.

    Datei C.php enthält nun einige Variablen, die ich in Datei A.php
    mittels echo $foo ausgeben möchte. Allerdings scheint Datei A.php diese Variablen gar
    nicht zu kennen, [...]

    Ich bin mir nicht sicher, ob ich dich richtig verstanden habe.

    Aber anscheinend stehen in der Datei "C.php" die benötigten Variablen, wie z. B. die Variable "$foo". Diese  Datei "C.php" wird durch eine Funktion in der Datei "B.php" inkludiert. Die Datei "B.php" wird von der Datei "A.php" inkludiert.

    Nun scheint ein auslesen in der Datei "A.php" der Variablen "$foo", welche in der Datei "C.php" deklariert wurde, nicht möglich.

    Auf die Variable "$foo" kann natürlich erst in der Datei "A.php" zugriffen werden, wenn _zuvor_ die Inklude-Anweisungen ausgeführt wurden.

    Ausserdem ist zu beachten, dass in Funktionen ein eigener Namensraum besteht. Zunächst kann aus einer Funktion nicht auf Variablen, die ausserhalb der Funktion deklariert wurden zugegriffen werden und umgekehrt. Abhilfe schafft hier der Befehl "global", der die übergebenen globale Variablen in den Namensraum der Funktion importiert.
    Um Variablen/Werte innerhalb einer Funktion auch ausserhalb zur Verfügung zu stellen, kann man sie am Ausführungsende der jeweiligen Funktion mittels dem Befehl "return" zurückgeben. Oder man schreibt die Werte in einer zuvor mit dem Befehl "global" in den Namensraum der Funktion importierten globalen Variablen.

    Siehe hierzu:
     - PHP-Handbuch: include():
       http://de.php.net/manual/de/function.include.php
     - dclp-FAQ: 6.1. Welche Variablenarten gibt es in PHP und wie greife ich auf sie zu?
       http://www.dclp-faq.de/q/q-php-variablen.html
     - PHP-Handbuch: Geltungsbereich von Variablen (global):
       http://de.php.net/language.variables.scope
     - PHP-Handbuch: return:
       http://de3.php.net/return

  5. Servus,

    Vorweg, vielen herzlichen Dank - vor allem die Beispiele haben sehr geholfen.
    Ich bin mir nicht mehr ganz sicher, wo das Problem lag, wahrscheinlich hatte ich die Funktion zu chaotisch angelegt.
    Dieses Mal, mit simplem code, klappt alles so wie ich es wollte.
    Zu dem Code siehe zuletzt, vorweg ein paar Antworten, soweit ich die auch geben kann.

    -Über den Gültigkeitsbereich von Variablen habe ich einiges gelesen. Allerdings  ... verstehe ich eher die Praxis als die Theorie, das dauert bei mir etwas länger. ;-)

    "kann man sie am Ausführungsende der jeweiligen Funktion mittels dem Befehl "return" zurückgeben."
    Das ist definitiv etwas, mit dem ich mich mehr beschäftigen muss/werde.

    "aber wer oder was hindert dich denn daran, den include vor dem zugriff auf die variablen zu machen?"
    Ich kann leider nicht mehr 100% genau wiedergeben, was ich wollte. Aber die include sollte Rücksicht nehmen, in welchem Verzeichnis man/frau sich befindet. ZB sollte der Unterschied 'so-gut-als-möglich automatisch' festgestellt werden. Ich bin ein Directory Monster.

    Nun der Code Teil, es funzt (Anmerkung, Dateien A.php und B.php sind im selben Verzeichnis, C.php ist eine Ebene darunter):

    -A.php

    <?php
     // A.php:
    include('B.php');
    b_load('..');
    echo $foo;
    echo $bar;
    ?>

    -B.php

    <?php
     // B.php:
     function b_load($file) {
      $C_PHP="${file}/C.php";
      if(file_exists($C_PHP)) { include($C_PHP);}
    }
    ?>

    -C.php (code mit Forum comments :-) )

    <?php
      // C.php:
    //$bla = "blubb";
    //$foo = "bar";
      // geht nit, Variablen sind nur im Kontext von function b_load in B.php gültig,
      // und somit (noch) nit global

    $GLOBALS["foo"]="bar";
    $GLOBALS["bla"]="blubb";
    $GLOBALS["bar"]=" -BAR- ";
      // nun geht das ganze, die Variablen sind global, mittels Array kann man das ganze noch
      // einfacher schreiben, siehe darunter

    //$GLOBALS["config"] = Array(
    //"foo"=>"bar",
    //"bla"=>"blubb"
    //);
    //ist evtl. einfacher zu schreiben, allerdings muss man dann auch mit echo $config["foo"] zugreifen.
    ?>