Löti: Einfache Funktion klappt nicht

Hi,

warum wird hier nicht das Ergebnis ausgegeben?
Mache ich nen Denkfehler?

<?php
function add($param1,$param2)
{
$summe=$param1+$param2;
 return $summe;
}
add(12,3);
echo $summe;
?>

Danke, Löti

  1. Hi,

    du hast einen Irrglauben bzgl. der Variablengültigkeit (nähere siehe Handbuch)

    function add($param1,$param2)
    {
    $summe=$param1+$param2;

    Jetzt hast du _innerhalb_ der Funktion die Variable $summe zur Verfügung

    return $summe;

    ...hier gibst du sie als Rückgabewert raus

    }

    $summe ist jetzt ungültig

    add(12,3);

    Du rufst die Funktion auf und _verwirfst_ ihren Rückgabewert

    echo $summe;

    Diese Variable existiert nicht

    -> Funktioniere würde z.B.
    echo add(12,3);

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
    1. Hi,

      du hast einen Irrglauben bzgl. der Variablengültigkeit (nähere siehe Handbuch)

      function add($param1,$param2)
      {
      $summe=$param1+$param2;
      Jetzt hast du _innerhalb_ der Funktion die Variable $summe zur Verfügung
      return $summe;
      ...hier gibst du sie als Rückgabewert raus

      ...und wo geht sie hin?
      Kannic sie mit global über die Funktion hinaus als gültig erklärt werden?

      Danke erstmal für den Hinweis, Löti

      }
      $summe ist jetzt ungültig

      add(12,3);
      Du rufst die Funktion auf und _verwirfst_ ihren Rückgabewert
      echo $summe;
      Diese Variable existiert nicht

      -> Funktioniere würde z.B.
      echo add(12,3);

      MfG
      Rouven

      1. <?php
        function add($param1,$param2)
        {
        $summe=$param1+$param2;
         return $summe;
         }
        $summe=add(12,3);
        echo $summe;
        ?>

        Klar, mit echo add gings noch leichter, aber diese kleine Funktion steht ja stellvertretend für die eigentlich nciht funktionierende (die jetzt auch funtzt ;-) )

        Danke, Löti

      2. Hi,

        zunächst mal, siehe Handbuch: Variable scope.

        Dort siehst du, dass du mit global _zunächst mal_ das Gegenteil erreichst: Du kannst eine Variable deren Gültigkeit _außerhalb_ der Funktion ist in die Funktion _hinein_ transportieren.
        Aber ja, im Endeffekt kannst du diesen Effekt so erzeugen:
        $summe = 0;
        function add($a, $b) {
          global $summe;
          $summe = $a+$b;
        }

        add(12,3);
        echo $summe;

        Das ist allerdings unglücklich bzw. schlechter Stil:

        1. Eine Funktion verfügt über eine Rückgabemöglichkeit - nutze sie! Dadurch kannst du sie nämlich in Ausgaben einbauen. Wenn du schreiben willst:
          Das Ergebnis von 12 + 3 ist 15
          heißt das bei dir:
          $summe = 0;
          $a = 12;
          $b = 3;
          add($a, $b);
          echo "Das Ergebnis von $a + $b ist $summe";

        Schöner wäre
        $a = 12;
        $b = 3;
        echo "Das Ergebnis von $a + $b ist ".add($a, $b);

        1. Du verlierst über kurz oder lang die Übersicht über deinen Code wenn man nicht sieht was rein und was rausgeht. Es gibt u.U. Situationen, wo man ganz schöne Klimmzüge machen muss um ohne solche globalen Variablen auszukommen, aber besser ist es - daher:
          i) Verwende für Ergebnisse von Funktionen das return-Statement
          ii) Übergebe alle in der Funktion benötigten Informationen als Parameter
          Spätestens wenn du eine Funktion an einer anderen Stelle wieder verwenden willst wirst du dich fragen warum irgendwas nicht funktioniert oder ungewöhnliche Nebeneffekte hat.
          Beispiel:
          $summe = 0;
          add(1,1);
          add($summe,2);
          echo $summe;

        Was würdest du, wenn du diesen Code _liest_ erwarten? Das 2 rauskommt. Was kommt raus? 4...

        MfG
        Rouven

        --
        -------------------
        ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
        1. Beispiel:
          $summe = 0;
          add(1,1);
          add($summe,2);
          echo $summe;

          Was würdest du, wenn du diesen Code _liest_ erwarten? Das 2 rauskommt. Was kommt raus? 4...

          Perfekt!
          Hast mich genau richtig auf dem falschen Fuß erwischt :-)
          Ich hätte 2 gesagt, aber es stimmt. $Summe war ja bereits überschrieben ud hatte den Wert "2", bevor sie zum 2. Mal benutzt wurde.
          Wenn jetzt da 50 Zeilen Scriptcode zwischen sind...böse Falle ;-)

          Was hältst Du von meiner Lösung unter "So gehts"?

          Grüße, Löti

          MfG
          Rouven

          1. Hi,

            Was hältst Du von meiner Lösung unter "So gehts"?

            Im Prinzip ist das ja eine Variante der Direktausgabe, die lediglich das Ergebnis kurz zwischenspeichert.

            MfG
            Rouven

            --
            -------------------
            ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
            1. Hi,

              Was hältst Du von meiner Lösung unter "So gehts"?
              Im Prinzip ist das ja eine Variante der Direktausgabe, die lediglich das Ergebnis kurz zwischenspeichert.

              MfG
              Rouven

              Ja, in diesem kurzen Beispiel stimmts.
              Im Original wird mit dem Zwischenergebnis noch etwas gearbeitet, eh es ausgegeben wird. Daher ist die Zwischenspeicherung nötig.

              Danke für die schnelle Hilfe

              Löti

        2. Hello,

          Das ist allerdings unglücklich bzw. schlechter Stil:

          1. Eine Funktion verfügt über eine Rückgabemöglichkeit - nutze sie! Dadurch kannst du sie nämlich in Ausgaben einbauen.

          und Du kannst die Funktionen schachteln. Das ist viel wesentlicher. Bei PHP bezieht sich das aber leider nur auf die _Benutzung_ der Funktion und leider nicht auf die Definition.

          Harzliche Grüße vom Berg
          http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau