Melvin Cowznofski: Außenstehende Variablenwerte innerhalb von Klassen

Hallo,

ich stehe vor einem grundlegenden PHP Verständnisproblem: Wie bekannt, kann innerhalb einer Funktion nicht auf eine Variable zugegriffen werden, die außerhalb der Funktion definiert ist:

Ressource 'test.php':

<?php

   $name = 'Hans';

   function testfunktion()
      {
         return $name;
      }

   echo testfunktion();

?>

Das funktioniert nicht und führt zu einem "Notice: Undefined variable: name".

Wenn man allerdings eine 2. Ressource 'config.php' anlegt, in der die Variable definiert ist, diese dann mit require() innerhalb der Funktion einbindet und auf diesem Weg auf den Variablenwert zugreifen öchte, dann funktioniert das:

Ressource 'config.php':

<?php

   $name = 'Julian';

?>

Ressource 'test.php':

<?php

   function testfunktion()
      {
         require('config.php');
         return $name;
      }

   echo testfunktion();

?>

Das funktioniert nun und führt zur Ausgabe von 'Julian'.

Und ich verstehe nicht, wieso das so ist. Wieso kann ich innerhalb einer Funktion nicht auf eine außenstehende Variable zugreifen, aber sehr wohl eine außenstehende, andere PHP Ressource einbinden und darin stehende Variablen verwenden?

Ich dachte bisher immer, bei Funktionen muss ich alle Variablenwerte, die ich innerhalb der Funktion brauche, beim Aufruf der Funktion mitübergeben, wenn sie nicht innerhalb der Funktion definiert sind.

Vielleicht kann mir wer auf verständliche Art erklären, wieso auch der von mir zufällig entdeckte Weg funktioniert.

Mit lieben Grüßen

Melvin Cowznofski

--
Melvin Cowznofski What – me worry?
  1. Hallo und guten Abend,

    ich stelle einfach mal eine Gegenfrage:

    hast Du bei deiner Require-Variante schon mal versucht, außerhalb der Funktion auf die Variable zuzugreifen?

    Grüße
    TS

  2. Hallo,

    Ich dachte bisher immer, bei Funktionen muss ich alle Variablenwerte, die ich innerhalb der Funktion brauche, beim Aufruf der Funktion mitübergeben, wenn sie nicht innerhalb der Funktion definiert sind.

    durch das Einbinden (so wie du es gemacht hast) ist sie innerhalb der Funktion definiert.

    Gruß
    Kalk

    1. Hallo Kalk,

      durch das Einbinden (so wie du es gemacht hast) ist sie innerhalb der Funktion definiert.

      das ist mir schon klar, sonst würde es ja nicht funktionieren. Meine Frage war aber, wieso das überhaupt funktioniert! Aus einer Funktion heraus auf eine Variable kann man nicht zugreifen, auf eine PHP Ressource schon?! Ich finde das einfach unlogisch.

      Mit lieben Grüßen

      Melvin Cowznofski

      --
      Melvin Cowznofski What – me worry?
      1. Hallo und guten Abend,

        durch das Einbinden (so wie du es gemacht hast) ist sie innerhalb der Funktion definiert.

        das ist mir schon klar, sonst würde es ja nicht funktionieren. Meine Frage war aber, wieso das überhaupt funktioniert! Aus einer Funktion heraus auf eine Variable kann man nicht zugreifen, auf eine PHP Ressource schon?! Ich finde das einfach unlogisch.

        Das eine findet beim Parsen statt, das andere während der Laufzeit.

        Grüße
        TS

      2. Tach!

        Aus einer Funktion heraus auf eine Variable kann man nicht zugreifen, auf eine PHP Ressource schon?! Ich finde das einfach unlogisch.

        Das ist das definierte und in der Dokumentation beschriebene Verhalten von include. Der includierte Code wird so ausgeführt, als ob er an der Stelle der Inkludierung stünde.

        dedlfix.

  3. Hallo Melvin,

    ich stehe vor einem grundlegenden PHP Verständnisproblem: Wie bekannt, kann innerhalb einer Funktion nicht auf eine Variable zugegriffen werden, die außerhalb der Funktion definiert ist:

    Ressource 'test.php':

    <?php
    
       $name = 'Hans';
    
       function testfunktion()
          {
             return $name;
          }
    
       echo testfunktion();
    
    ?>
    

    Das funktioniert nicht und führt zu einem "Notice: Undefined variable: name".

    Der PHP-Interpreter kennt verschiedene Gültigkeitsbereiche für Variablen, sog. Scopes. Die Variable hast du im globalen Scope angelegt, die Funktion hat ihren eigenen Scope. Du musst dem Interpreter sagen, dass du die Variable aus dem globalen Scope haben willst:

    $foo = "bar";
    
    function fun() {
      global $foo;
      echo $foo;
    }
    

    Wenn man allerdings eine 2. Ressource 'config.php' anlegt, in der die Variable definiert ist, diese dann mit require() innerhalb der Funktion einbindet und auf diesem Weg auf den Variablenwert zugreifen öchte, dann funktioniert das:

    config.php wird in dem Fall im gleichen Scope ausgewertet wie die Funktion, deshalb ist hier $name eine Funktions-lokale Variable.

    LG,
    CK

  4. Hallo TS, Tabellenkalk, dedlfix und Christian,

    danke für Eure Antworten, ich denke, dass ich dieses Verhalten nun besser verstehe. Meine Frage ist somit beantwortet. Schönes Wochenende!

    Mit lieben Grüßen

    Melvin Cowznofski

    --
    Melvin Cowznofski What – me worry?