Manuel B.: Kein Rückgabewert in Funktion

Hi,
ich steh momentan echt aufm Schlauch. Ich hab eine Funktion geschrieben, die sich beharrlich weigert, einen Rückgabewert auszugeben.

  
function pathway($id = ''){  
 global $pathway_array, $pathway_actpage;  
  
 if($id == ""){  
  $act_ = $GLOBALS['db']->read(TB_PAGES, "parent, menu_text", "id='" . get('id') . "'");  
  $id = $act_['parent'];  
  $pathway_actpage = array('id' => $id, 'menu_text' => $act_['menu_text']);  
 }  
 $act = $GLOBALS['db']->read(TB_PAGES, "parent, menu_text", "id='" . $id . "'");  
 $pathway_array[] = array('id' => $id, 'menu_text' => $act['menu_text']);  
  
 if($act['parent'] != "1")  
  pathway($act['parent']);  
 else{  
  $pathway_array = array_reverse($pathway_array);  
  $pathway = $GLOBALS['user']->get_username($GLOBALS['my']->id()) . " :: ";  
  
  foreach($pathway_array as $pathway_page){  
   $pathway .= '<a href="" class="pathway_pages">' . $pathway_page['menu_text'] . '</a> > ';  
  }  
  $pathway .= '<span class="pathway_act_page">' . $pathway_actpage['menu_text'] . '</span>';  
  echo $pathway;  
  return $pathway;  
 }  
}  

Jetzt wird zwar der String mit echo $pathway; ausgegeben, das return $pathway ist aber wirkungslos.

Der Aufruf erfolgt per

  
echo pathway();  

Ich hab echt keine Ahnung mehr, woran es liegen kann. Sieht vielleicht jemand einen Fehler? Eine andere Funktion in der gleichen Datei macht keine Probleme. Ich hab auch nichts gefunden, das "pathway" ein reserviertes Wort ist, und auch eine änderung des Funktionsnamens brachte nix :(

  1. Hallo,

    if($act['parent'] != "1")
      pathway($act['parent']);

    wo ist denn hier Dein return in dem Zweig?

    Gruß aus Berlin!
    eddi

    1. Hi,

      if($act['parent'] != "1")
        pathway($act['parent']);

      wo ist denn hier Dein return in dem Zweig?

      Da brauch ich keinen, da diese Funktion sich selbst aufruft, bis die Bedingung nicht mehr erfüllt ist. Erst dann wird das erzeugte Array durchlaufen und ein String erzeugt, der per return zurückgegeben wird.

      1. Hallo,

        Da brauch ich keinen, da diese Funktion sich selbst aufruft, bis die Bedingung nicht mehr erfüllt ist. Erst dann wird das erzeugte Array durchlaufen und ein String erzeugt, der per return zurückgegeben wird.

        und genau in diesem Denkansatz liegt auch Dein Irrtum. Notiere also:

        if($act['parent'] != "1")
           return(pathway($act['parent']));

        Gruß aus Berlin!
        eddi

    2. Shit, jetzt fällts mir auf....... ~gegendiewandlauf~

      Das return wirk ja auch den aufruf aus der Funktion selbst, und nicht auf den Aufruf aus dem Hauptprogramm.

      Ok, war ein völliger Denkfehler. Danke, durch dich bin ich draufgekommen.

  2. Hi Manuel,

    ich steh momentan echt aufm Schlauch. Ich hab eine Funktion geschrieben, die sich beharrlich weigert, einen Rückgabewert auszugeben.

    *g*

    function pathway($id = ''){
      [...]
      echo $pathway;
      return $pathway;
    }
    }

    Jetzt wird zwar der String mit echo $pathway; ausgegeben, das return $pathway ist aber wirkungslos.

    Was heißt "wirkungslos"? Was liefert die Funktion wirklich als Ergebnis ab? Einen Leerstring? Ein null?

    echo pathway();

    Da wäre es interessant, mal ein

    p = pathway();
      var_dump(p);

    zu machen. Was wird wirklich zurückgegeben, welchen Typ hat der Ausdruck?
    Mir persönlich kommt es verdächtig vor, eine Variable genauso zu nennen wie die Funktion. Aber wenn du sagst, du hättest den Funktionsnamen schon probehalber geändert...
    Hast du auch schon versucht, anstatt des 'return $pathway;' mal eine Stringkonstante zurückzugeben? Das klappt?
    Was mir noch auffällt: Die Variable $pathway wird erst *innerhalb* eines Blocks, nämlich im foreach(), definiert. Gibt es da eventuell ein Problem mit dem Gültigkeitsbereich?

    So long,
     Martin

    --
    Viele Fachleute vertreten die Ansicht, jedes Feature eines Programms, das sich nicht auf Wunsch abstellen lässt, sei ein Bug.
    Außer bei Microsoft. Da ist es umgekehrt.
    1. Hi Martin,

      Hast du auch schon versucht, anstatt des 'return $pathway;' mal eine Stringkonstante zurückzugeben? Das klappt?

      Nein, das klappt auch nicht, aber wie schon wieter unten geshrieben, liegt es daran, das sich die Funktion selbst aufruft und das return natürlich nur auf den letzen Aufruf wirkt. Daher gilt der Rückgabewert ja für die Funktion selbst ;)

      1. Hallo,

        [...] liegt es daran, das sich die Funktion selbst aufruft und das return natürlich nur auf den letzen Aufruf wirkt.

        ich hatte mich so auf die letzten beiden Zeilen der Funktion konzentriert und habe völlig übersehen, dass sie sich selbst rekursiv aufruft.
        Dann ist ja nun alles klar. :-)

        Ciao,
         Martin

        --
        Time's an illusion. Lunchtime doubly so.
          Douglas Adams, "The Hitchhiker's Guide To The Galaxy"