Announcement

Collapse
No announcement yet.

Verschachtelte Funktionen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Verschachtelte Funktionen

    Hallo Miteinander

    Sowie ich das mitbekommen habe müssen Funktionen so klein wie möglich, aber daher viele davon erstellt werden. Sodass praktisch eine Funktion nur etwas macht.

    Bei Meinem Beispiel (Funktionen für die Berechnung von Brutto/Netto/MwSt Beträge, dann Rundungen) könnte man vielleicht noch mehr aussplitten, aber ich habe es im Moment auf 4 Funktionen Belassen.

    Zum Problem:
    Die Funktionen funktionieren Problemlos wenn ich keine Verschachtelung mache. Nach jeder Funktion returne ich das 'Zwischenergebnis' und kann sie somit als Parameter an die weitere Funktion weitergeben. Aber diese Lösung gefällt mir nicht, mir wurde schon Verschachtelung empfohlen.

    So sieht meine Verschachtelung aus:
    PHP Code:
    <?php

    // KONSTANTE
    define('MWST'0.076);

    (!isset(
    $_POST['betrag'])) ? $betrag         '' $betrag         $_POST['betrag'];
    (!isset(
    $_POST['was']))    ? $was_ausrechnen '' $was_ausrechnen $_POST['was'];

    function 
    filter_data($betrag$was_ausrechnen$striptags true) {
        if (
    get_magic_quotes_gpc()) {
            
    $betrag stripslashes($betrag);
            
    $was_ausrechnen stripslashes($was_ausrechnen);
        }
        if (
    $striptags === true) {
            
    $betrag_fltrd strip_tags($betrag);
            
    $was_ausrechnen_fltrd strip_tags($was_ausrechnen);
        }
        
    $betrag_trmd          trim(htmlspecialchars($betrag_fltrd));
        
    $was_ausrechnen_trmd trim(htmlspecialchars($was_ausrechnen_fltrd));
        
    $form_eingaben          = array($betrag_trmd$was_ausrechnen_trmd);
        
            function 
    mwst_berechnung_brutto_netto($betrag_trmd$was_ausrechnen_trmd) {
                if (
    'brutto' == $was_ausrechnen_trmd) {
                
    $ergebnis_bn $betrag_trmd + ($betrag_trmd MWST);          
                
    $anteil_mwst $ergebnis_bn  $betrag_trmd;        
                } else if (
    'netto' == $was_ausrechnen_trmd) {
                
    $ergebnis_bn   $betrag_trmd / (MWST 1);          
                
    $anteil_mwst   $betrag_trmd $ergebnis_bn;        
                
                function 
    mwst_berechnung_rundung_5rp($ergebnis_bn) {
                    
    $betrag_fltrd_gerundet_5rp round($ergebnis_bn1) / 2;       
                    
    $ergebnis_bn_5rp2dez       number_format($betrag_fltrd_gerundet_5rp2','''); 
                    
                    function 
    mwst_berechnung_ausgabe($ergebnis_bn_5rp2dez$problem_felder) {
                        if (isset (
    $problem_felder[0]) ||
                        
    0   == $ergebnis_bn_5rp2dez) {
                        
    $ergebnis_ausgabe '';
                        } else {
                        
    $ergebnis_ausgabe 'Ergebnis: ' $ergebnis_bn_5rp2dez;
                        }
                        return 
    $ergebnis_ausgabe;
                    }
                    return 
    $ergebnis_bn_5rp2dez;
                }
                return 
    $ergebnis_bn;
                }
            }
                        
        return 
    $form_eingaben;

    }
    Formular:

    PHP Code:
    <?php
    require_once('function_mwst.php');
    ?>

    <form method="post" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
        <label for="betrag"<?php if(in_array('betrag'$problem_felder)) {echo ' style="color: red;"';} ?>>Betrag *</label>
        <input type="betrag" id="betrag" name="betrag" value="<?php echo $betrag?>" /> <span>(Nur Zahlen, max. 15 Zahlen)</span><br />
        <label for="was">Was ausrechnen?</label>
        <select id="was" name="was">
            <option value="brutto" <?php echo ('brutto' == $was_ausrechnen) ? 'selected="selected"' '';?>>Brutto</option>
            <option value="netto" <?php echo ('netto' == $was_ausrechnen) ? 'selected="selected"' '';?>>Netto</option>
        </select><br />
        <label for="send">Absenden</label>
        <input id="send" type="submit" name="send" value="Klick" />
    </form>

    <?php
    filter_data
    ($betrag$was_ausrechnen$striptags true);
    mwst_berechnung_brutto_netto($betrag_trmd$was_ausrechnen_trmd);
    //mwst_berechnung_rundung_5rp($ergebnis_bn);
    //echo mwst_berechnung_ausgabe($ergebnis_bn_5rp2dez, $problem_felder);
    ?>
    Schon bei der Übergabe von $betrag_trmd auf die zweite Funktion kommt diese Fehlermeldung:

    Notice: Undefined variable: betrag_trmd in [...]/mwst_form.php on line 26 Notice: Undefined variable: was_ausrechnen_trmd in [...]/mwst_form.php on line 26
    Also als ob diese 2 Variabeln nicht definiert sind, obwohl sie gleich oberhalb der zweiten Funktion eigentlich erzeugt werden. Vor dem Anfang der zweiten verschachtelten Funktion kann ich diese Variabeln problemlos ausgeben, aber warum kann ich diese nicht als Parameter weiter übergeben?
    Was mache ich falsch?


    Danke schon im Voraus für die Antworten! :-)

  • #2
    Dachte immer Funktionen müssen genau so lang sein, wie sie sein müssen, um ihre Aufgabe zu erfüllen. Das kann mal kürzer und mal lännger sein. Und eine Funktion sollte schon mehrfach genutzt werden oder einen sinnvollen logischen Abschnitt darstellen. Teilen, um der Teilung willen erzeugt nicht leserlichen Code. Und warum der Auffruf einer Funktion und die Verarbeitung des Ergebnisses "nicht gefällt", erschließt sich nicht. Obiger code ist -zumindestens für mich - schlecht lesbar. Da wird eine Funktion aufgerufen. Hmm, was gibt sie zurück, ach das steht dann ganz unten ..scroll,scroll scroll.

    Es sollte helfen, die als Fehler gezeigten Variablen als global zu definieren http://php.net/manual/de/language.functions.php
    Christian

    Comment


    • #3
      Ich Möchte dies ohne global reingeladene Variabeln machen, wurde mir strengstens davon abgeraten. Es wurde mir mal ein konkretes Beispiel gezeigt warum man das nicht (mehr) tun sollte, weiss ihn aber nicht mehr auswendig.
      Besser wäre entweder als Parameter übergeben oder Konstante benutzen.

      Gäbe es einen anderen Grund warum zum Beispiel $betrag_trmd nicht an function mwst_berechnung_brutto_netto($betrag_trmd, $was_ausrechnen_trmd) weitergegeben werden kann?

      Comment


      • #4
        Hallo Publisher,
        also um es mal kurz und schmerzlos zu machen und auch wenn es Christian "nur" "schlecht lesbar" findet: Ich finde deinen Code total unübersichtlich, unverständlich, unwartbar und eigentlich grausig.
        Irgendwie hab ich den Eindruck, dass dir ein paar Grundlagen fehlen. Die von dir gen. "Fehlermeldung" ist keine Fehlermeldung, sondern eine "Notice", also "nur" ein Hinweis des PHP-Interpreters auf eine undefinierte Funktion.
        Du solltest dich mal mit Namensräumen und den Gültigkeitsbereichen von Variablen beschäftigen. Auch deine "Verschachtelung" ist irgendwie sinnfrei, die Funktionen werden nie aufgerufen! Wozu sind sie dann implementiert?
        Auch hat der Interpreter mit seiner "Notice" recht. Er bemängelt die Zeile 26 in mwst_form.php. Das ist dein Formular! Und dort ist $betrag_trmd und $was_ausrechnen_trmd im Aufruf von mwst_berechnung_brutto_netto() tatsächlich undefiniert.
        Einen echten Fehler wird dir der Interpreter dagegen für den Aufruf von mwst_berechnung_brutto_netto() werfen. Diese Funktion gibt es nämlich im verwendeten Kontext nicht! mwst_berechnung_brutto_netto() ist nur INNERHALB von filter_data() gültig! Siehe dazu das Thema: Funktionen und die dort aufgeführten Beispiele und Kommentare.

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Um noch ein wenig weiter zu machen. In deiner function_mwst.php kann es eine "Notice: Undefined variable" geben, die zum echten Problem wird.
          In filter_data() wird den Variablen $betrag_fltrd und $was_ausrechnen_fltrd nur dann ein Wert zugewiesen, wenn $striptags === true ist! Anschließend rechnest du aber ohne weitere Prüfung mit $betrag_trmd und $was_ausrechnen_fltrd. Für den Fall, dass filter_data() mal nicht mit dem Standardwert, sondern mit FALSE für $striptags aufgerufen wird, wird das Ergebnis absolut undefiniert sein.

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Danke Falk für deine Feedbacks.

            Ich habe nun die Funktionen selbst nicht verschachtelt erstellt, dafür aber beim Abruf verschachtelt.

            Ist das so besser gelöst?

            Funktionieren tuts.

            Funktionen
            PHP Code:
            <?php

            // KONSTANTE
            define('MWST'0.076);

            (!isset(
            $_POST['betrag'])) ? $betrag         '' $betrag         $_POST['betrag'];
            (!isset(
            $_POST['was']))    ? $was_ausrechnen '' $was_ausrechnen $_POST['was'];

            function 
            filter_data_betrag($betrag$striptags true) {
                if (
            get_magic_quotes_gpc()) {
                    
            $betrag stripslashes($betrag);
                }
                if (
            $striptags === true) {
                    
            $betrag strip_tags($betrag);
                }
                
            $betrag_fltrd trim(htmlspecialchars($betrag));
                return 
            $betrag_fltrd;
            }

            function 
            filter_data_was_ausrechnen($was_ausrechnen$striptags true) {
                if (
            get_magic_quotes_gpc()) {
                    
            $was_ausrechnen stripslashes($was_ausrechnen);
                }
                if (
            $striptags === true) {
                    
            $was_ausrechnen strip_tags($was_ausrechnen);
                }
                
            $was_ausrechnen_fltrd trim(htmlspecialchars($was_ausrechnen));
                return 
            $was_ausrechnen_fltrd;
            }

            function 
            mwst_berechnung_brutto_netto($betrag_fltrd$was_ausrechnen_fltrd) {
                if (
            'brutto' == $was_ausrechnen_fltrd) {
                    
            $ergebnis_bn $betrag_fltrd + ($betrag_fltrd MWST); 
                    
            $anteil_mwst $ergebnis_bn  $betrag_fltrd;         
                    return 
            $ergebnis_bn;
                } else if (
            'netto' == $was_ausrechnen_fltrd) {
                    
            $ergebnis_bn   $betrag_fltrd / (MWST 1);          
                    
            $anteil_mwst   $betrag_fltrd $ergebnis_bn;       
                    return 
            $ergebnis_bn;
                }
            }

            function 
            mwst_berechnung_rundung_5rp($ergebnis_bn) {
                
            $betrag_fltrd_gerundet_5rp round($ergebnis_bn1) / 2;                       
                
            $ergebnis_bn_5rp2dez       number_format($betrag_fltrd_gerundet_5rp2',''');
                return 
            $ergebnis_bn_5rp2dez;
            }

            function 
            mwst_berechnung_ausgabe($ergebnis_bn_5rp2dez$problem_felder) {
                if (isset (
            $problem_felder[0]) ||
                    
            0   == $ergebnis_bn_5rp2dez) {
                    
            $ergebnis_ausgabe '';
                } else {
                    
            $ergebnis_ausgabe 'Ergebnis: ' $ergebnis_bn_5rp2dez;
                }
                return 
            $ergebnis_ausgabe;
            }
            Formular:
            PHP Code:
            <?php
            require_once('function_mwst.php');
            ?>

            <form method="post" action="<?php echo $_SERVER['SCRIPT_NAME']; ?>">
                <label for="betrag"<?php if(in_array('betrag'$problem_felder)) {echo ' style="color: red;"';} ?>>Betrag *</label>
                <input type="betrag" id="betrag" name="betrag" value="<?php echo $betrag?>" /> <span>(Nur Zahlen, max. 15 Zahlen)</span><br />
                <label for="was">Was ausrechnen?</label>
                <select id="was" name="was">
                    <option value="brutto" <?php echo ('brutto' == $was_ausrechnen) ? 'selected="selected"' '';?>>Brutto</option>
                    <option value="netto" <?php echo ('netto' == $was_ausrechnen) ? 'selected="selected"' '';?>>Netto</option>
                </select><br />
                <label for="send">Absenden</label>
                <input id="send" type="submit" name="send" value="Klick" />
            </form>

            <?php

            echo mwst_berechnung_ausgabe(
                 
            mwst_berechnung_rundung_5rp(
                     
            mwst_berechnung_brutto_netto(
                         
            filter_data_betrag($betrag$striptags true),
                         
            filter_data_was_ausrechnen($was_ausrechnen$striptags true)
                     )
                 ),
                 
            $problem_felder
                 
            );

            ?>

            Comment


            • #7
              Hallo,
              Originally posted by Publisher View Post
              ...Ist das so besser gelöst?
              Das sieht zumindest schonmal besser aus .

              Der Sinn einer Funktion besteht doch aber gerade darin, wiederholte Funktionalität abstrakt und wiederverwendbar abzubilden. Deine beiden Funktionen function filter_data_betrag und function filter_data_was_ausrechnen sind - bis auf die unterschiedlichen Bezeichner - absolut identisch. Genau hier wäre es doch nun sinnvoll, diese Funktionalität in EINER Funktion abzubilden.
              PHP Code:
              function filter_data($wert$striptags true) {
                  if (
              get_magic_quotes_gpc()) {
                      
              $wert stripslashes($wert);
                  }
                  if (
              $striptags === true) {
                      
              $wert strip_tags($wert);
                  }
                  
              $wert_fltrd trim(htmlspecialchars($wert));
                  return 
              $wert_fltrd;

              Dein Aufruf würde dann so aussehen:
              PHP Code:
              echo mwst_berechnung_ausgabe(
                   
              mwst_berechnung_rundung_5rp(
                       
              mwst_berechnung_brutto_netto(
                           
              filter_data($betrag$striptags true),
                           
              filter_data($was_ausrechnen$striptags true)
                       )
                   ),
                   
              $problem_felder
                   
              ); 
              Auch solltest du dir einen einheitlichen Stil angewöhnen. Ein return gehört nach Möglichkeit IMMER ans Ende einer Funktion. Bei function mwst_berechnung_ausgabe hast du das auch so gemacht. Bei function mwst_berechnung_brutto_netto steht das return jedoch jeweils innerhalb des if- bzw. else-Zweiges, obwohl die Funktion die gleiche Struktur hat.

              Was das Besondere an dem Funktionsaufruf in der Form filter_data_betrag($betrag, $striptags = true) ist, ist dir bewusst? Man könnte es nämlich auch so:
              PHP Code:
              filter_data_betrag($betragtrue); 
              oder eigentlich sogar so:
              PHP Code:
              filter_data_betrag($betrag); 
              schreiben.

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment

              Working...
              X