Ankündigung

Einklappen
Keine Ankündigung bisher.

Probleme mit verschachtelten Funktionen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Probleme mit verschachtelten Funktionen

    Hallo Leute,

    langsam fluppt es bei mir. Jetzt eine Frage, bei der es nicht ums Überleben geht, sondern um schreibtechnische Ökonomie.
    Ich wollte gestern bei einer sehr umfangreichen Funktion, jene Teile, die sich 1 zu 1 wiederholen in eine verschachtelte Funktion schreiben nach diesem Strickmuster:
    PHP-Code:
    function Hauptfunktion()
    {
          function 
    Hilfsfunktion();
         {
                 
    Codeder oft vorkommt...
          }

          
    viel Code;
          
    Hilfsfunktion();
          
    noch mehr Code;
          
    Hilfsfunktion();
          
    usw....

    Leider funktioniert das nicht, weil dann eine Fehlermeldung kommt nach dem Motto: Function Hilfsfunktion() kann nicht redeklariert werden.
    Für den genauen Wortlaut, müßte ich das nochmal umbauen und nochmal starten. Vielleicht wißt ihr ja, was ich meine und wo das Problem ist?

    Ich kann es übrigens nicht so einfach in eine "externe" Funktion schreiben, weil der Code, den ich in diese verschachtelten Funktion packen will, auf die lokalen Variablen dieser Hauptfunktion zugreifen muss. Er verändert sie auch!

    Danke für eurer Know How und die Zeit!

  • #2
    Zitat von ballotade Beitrag anzeigen
    Ich kann es übrigens nicht so einfach in eine "externe" Funktion schreiben, weil der Code, den ich in diese verschachtelten Funktion packen will, auf die lokalen Variablen dieser Hauptfunktion zugreifen muss. Er verändert sie auch!
    Dafür gibt es Parameter und Rückgabewerte bzw. wenn du objektorientiert arbeitest Objekt-Eigenschaften.

    Abgesehen von dem ; am Ende des zweiten Methodenkopfes sollte das aber so funktionieren. Aber wie gesagt: Du solltest das anders lösen.

    Kommentar


    • #3
      Also in der Verschachtelung kann ich gar keinen Sinn entdecken!
      Solltest Du nicht OOP arbeiten befinden sich Deine Funktionen i.d.R. alle im globalen Scope und kannst sie auch per Übergabe von Werten - wie Tropi bereits gesagt hat - aufrufen.
      PHP-Code:
      function firstFunction$value ) {

          return ++
      $value;

      }

      function 
      secondFunction$start ) {

          return 
      firstFunction$start );

      }

      echo 
      secondFunction); 
      Ausgabe:
      Code:
      2
      Aber es wäre wirklich sinnvoller, gleich OOP zu arbeiten, gerade wenn Du von " umfangreichen" Funktionen/Code sprichst.
      Competence-Center -> Enjoy the Informatrix
      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

      Kommentar


      • #4
        Mit Closures kann man so was machen ... Aber wirklich sinn macht das hier eher nicht.

        Kommentar


        • #5
          Ich kann es übrigens nicht so einfach in eine "externe" Funktion schreiben, weil der Code, den ich in diese verschachtelten Funktion packen will, auf die lokalen Variablen dieser Hauptfunktion zugreifen muss. Er verändert sie auch!
          Auch eine Funktion bildet einen eigenen Scope. Die Nutzung lokaler Variablen würde also sowieso nicht funktionieren. Außer: die bereits angesprochenen Closures.

          und kannst sie auch per Übergabe von Werten - wie Tropi bereits gesagt hat - aufrufen.
          Und für veränderliche Variablen gibt es auch die („altmodischen“) Referenzen.
          [COLOR="#F5F5FF"]--[/COLOR]
          [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
          [COLOR="#F5F5FF"]
          --[/COLOR]

          Kommentar


          • #6
            Hi Leute,

            erstmal danke für eure schnelle Antworten.

            Erstmal: was sind closures?

            Würde es irgendein Vorteil bringen, diese Unterfunktion als object zu definieren? Wie ich das verstehe, wäre doch da auch das Problem, dass es nur einmal initialisiert werden kann, oder?

            Also eigentlich wollte ich das garnicht so schwierig machen. Ich erkläre mein Problem mal anders:
            Ich habe also diese ellenlange Function, in der sich mehrere Textpassagen absolut wortgetreu mehrfach wiederholen. Wenn ich in einer dieser Passage was ändere, muss ich die anderen Stellen suchen und dort ebenfalls alles ändern und das ist nervig.
            Warum ich zögere es mit einer Funktion zu schreiben, der ich alles übergebe ist, dass dort mindestens 10 Variablen beteiligt sind und MEHRERE davon verändert werden. Soweit ich weiß, kann man doch mit Functionen nur eine Variable zurückgeben?

            Ich such nur eine ganz einfache Lösung...

            Weiß einer was zu diesem Problem, dass die Unterfunktion beim nochmaligen Aufruf den Fehler verursacht, dass sie nicht redeklariert werden kann?

            Kommentar


            • #7
              Erstmal: was sind closures?
              Etwas mehr Eigeninitiative wäre angebracht: PHP Closures
              Warum ich zögere es mit einer Funktion zu schreiben, der ich alles übergebe ist, dass dort mindestens 10 Variablen beteiligt sind und MEHRERE davon verändert werden. Soweit ich weiß, kann man doch mit Functionen nur eine Variable zurückgeben?
              Nö, je nachdem, wieviele Variablen Deine Funktion verarbeitet, kannst Du die natürlich auch in der Anzahl übergeben. Aber eine Variable kann unterschiedliche Datentypen enthalten. Unter den Datentypen gibt bspw. Arrays oder Objekte.

              Aber das sind alles Dinge, die Du in der offiziellen Doku auch selbst finden kannst: http://php.net/manual/de/
              Competence-Center -> Enjoy the Informatrix
              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

              Kommentar


              • #8
                Subroutinen wie

                PHP-Code:
                function a() {
                    

                    
                function b() {
                    }

                machen sehr wohl Sinn. In JS ist sowas defacto täglich Brot.

                Dummerweise sind in PHP Funktionen immer global, daher auch die Fehlermeldung „Function Hilfsfunktion() kann nicht redeklariert werden“.

                Unterm Strich kann man sagen, daß Dein Vorhaben in PHP leider nicht wirklich elegant gelöst werden kann. Mit einer Kombination aus PHP-Closures und Referenzen wäre es jedoch machbar:

                PHP-Code:
                function hallo() {
                    
                $hallo "Hallo";

                    
                $helper = function() use (&$hallo) {
                        
                $hallo.=" Welt";
                        
                $helper = function() use (&$hallo) {
                            
                $hallo .= "!";
                        };
                        
                $helper();
                    };

                    
                $helper();
                    return 
                $hallo;
                }

                echo 
                hallo(); 
                vg
                jack
                -

                Kommentar


                • #9
                  machen sehr wohl Sinn. In JS ist sowas defacto täglich Brot.
                  ...und in C++ oder meinetwegen Java vielleicht auch.
                  Hier gehts aber nunmal um PHP, nicht um JS...
                  Competence-Center -> Enjoy the Informatrix
                  PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                  Kommentar


                  • #10
                    Das was ich geschrieben habe gilt genauso fuer PHP (s. Beispiell php-code), nur dass es in Php nicht so oft eingesetzt wird wie in anderen Sprachen. Das hat allerdings einen "geschichtlichen" Hintergrund, weil Lambdas in Php lange nicht moeglich waren. "Closures" hat man nicht umsonst implementiert. Es macht ueberhaupt keinen Sinn den globalen Namensraum mit temoraeren Helper-Funktionen zuzumuellen.

                    Vg
                    Jack
                    -

                    Kommentar


                    • #11
                      Zitat von jack88 Beitrag anzeigen
                      Es macht ueberhaupt keinen Sinn den globalen Namensraum mit temoraeren Helper-Funktionen zuzumuellen.
                      Hat damit ja nichts zu tun. Kannst dir ja einen Namespace für die Funktion einfallen lassen.

                      Allerdings liegt der Fehler wohl eher an "ellenlange Function". Diese Funktion hat wohl zu viele Verantwortlichkeiten (vor allem bei > 10 (!?) Parametern). Das sollte in eine Klasse ausgelagert werden. Ob da jetzt nur eine Instanz davon erzeugt wird oder nicht ist doch egal. (Datenbankverbindungen & Co. haben in aller Regel auch nur eine Instanz.)

                      Kommentar


                      • #12
                        Hat damit ja nichts zu tun. Kannst dir ja einen Namespace für die Funktion einfallen lassen.
                        Mit globalen Namensraum war gemeint, daß die Funktion global verfügbar ist, also von überall aufgerufen werden kann und nicht überschrieben werden kann wenn sie unter einem bestimmten Namen bereits deklariert wurde. Ob mit oder ohne Namespace spielt keine Rolle.

                        Das sollte in eine Klasse ausgelagert werden.
                        Wir sprechen hier von "Hilfsfunktion()" also Wegwerf-Funktionen sozusagen die man nicht wiederverwenden will, weil sie nur in einem ganz speziellen Kontext gebraucht wird.

                        vg
                        jack
                        -

                        Kommentar


                        • #13
                          Wow, da ist ja eine echte Diskussion entbrannt.

                          Ich merke, dass ich noch einiges Wissen brauche um ihr wirklich zu folgen. Was ich raushöre ist, dass es nicht so einfach geht, wie ich es gern hätte: Codefragmente 1:1 auslagern und aufrufen, wenn ich sie brauche.

                          Ich lese mal zu einigen eurer Stichpunkte in meinen Büchern nach und probiere es aus.

                          Ich danke euch auf jeden Fall!!!

                          Kommentar


                          • #14
                            Zitat von jack88 Beitrag anzeigen
                            Mit globalen Namensraum war gemeint, daß die Funktion global verfügbar ist, also von überall aufgerufen werden kann und nicht überschrieben werden kann wenn sie unter einem bestimmten Namen bereits deklariert wurde. Ob mit oder ohne Namespace spielt keine Rolle.
                            Okay, dann habe ich damit falsch verstanden. Was dann da "zugemüllt" ist verstehe ich zwar nicht ganz, aber gut. Abgesehen davon das wir hier von einer Funktion sprechen.

                            Wie schon gesagt, wenn man objektorientiert arbeitet kann man mit public/private auch ganz leicht den Zugriff von außen steuern. Die von dir angesprochene "Lösung" ist auch für mich als "Fortgeschrittener" nicht unbedingt gut lesbar.

                            Kommentar


                            • #15
                              Die von dir angesprochene "Lösung" ist auch für mich als "Fortgeschrittener" nicht unbedingt gut lesbar.
                              Deswegen meinte ich auch:

                              „nicht wirklich elegant“
                              weil ich sowas

                              PHP-Code:
                              function() use (&$hallo) {...} 
                              eben auch nicht schön finde.

                              Allerdings wage ich zu bezweifeln, daß es mit „Wegwerf-Klassen“ besser/schöner wird.

                              vg
                              jack
                              -

                              Kommentar

                              Lädt...
                              X