Kai: Code in Funktion verschieben

Hi,

ich steh grad etwas auf dem Schlauch. In einem Script, dass eine php-Klasse (fpdf) benutzt, habe ich einen Code-Teil, den ich öfter nutzen will.

Ich bin mir aber etwas unsicher, wie dann der "return Teil" aussehen muss.

Der Code sieht so aus,

  
if (strpos($text1,"###")!==false) {  
#echo("found");  
$text1_seiten=explode("###",$text1);  
$arr_i=0;  
foreach ($text1_seiten AS $einzelseiten) {  
$arr_i++;  
$einzelseiten = str_replace ('\r\n', '', $einzelseiten);  
$this->MultiCell( 200, 4,"$einzelseiten", 0, 'J', 0);  
if ($arr_i != count($text1_seiten)) {  
$this->AddPage();  
}  
}  
} else {  
$this->MultiCell( 200, 4,"$text1", 0, 'J', 0);  
}  

Ich würde gerne einfach im Script dann mit einem Einzeiler die Funktion aufrufen

  
function functionsname($text, $wieheißtdasvordempfeileigentlich);  

Wäre klasse, wenn die Funktion dann selbstständig "die Arbeit" verrichtet,die hier gefragt ist.
Die Arbeit = Prüfen, ob ### vorkommt, wenn ja, dann einen Seitenumbruch im PDF erzeugen.

Da ich manchmal $this-> und manchmal $pdf-> benutze, würde ich das $wieheißtdasvordempfeileigentlich gerne als Parameter übergeben.

Ich gehe davon aus, dass die Funktion die Arbeit nicht so ohne weiteres alleine alleine, d.h. automatisiert verrichten kann, ich also im Script doch etwas mehr als einen Einzeiler benötige.

Wie muß ich die Funktion erstellen, damit ich im Script selber möglichst wenig Code benötige?

Gruß, Kai

  1. Hat keiner eine Idee?
    Gruß, Kai

    1. Hat keiner eine Idee?

      Poste doch mal deine bisherigen Versuche. Oder versuche nochmal auf verständliche Weise zu erklären, was die Funktion machen soll. Wieso willst du überhaupt irgendeinen Rückgabewert, wenn dir selber auf Anhieb kein sinnvoller einfällt?

      1. Hi,

        versuche nochmal auf verständliche Weise zu erklären, was die Funktion machen soll.

        Was genau hast Du nicht verstanden?

        Es ist schwer, etwas nochmal zu erklären, wenn man nicht genau weiß, was an der ersten (vermeintlich guten, aber dann doch nicht so guten?) Erklärung dann doch nicht verständlich war.

        Hilf mir und sag mal genau, was an der Fragestellung nicht verständlich war?

        Gruß,Kai

        P.S: Vielleicht hilft Dir auch meine originale Fragestellung im fpdf-forum?

        1. Du schreibst nur, dass du den Code in eine Funktion packen möchtest und Probleme mit dem Rückgabewert hast.

          Da reicht im Prinzip schon:

            
            
          function whoop(){  
             if (strpos($text1,"###")!==false) {  
                #echo("found");  
                $text1_seiten=explode("###",$text1);  
                $arr_i=0;  
                foreach ($text1_seiten AS $einzelseiten) {  
                   $arr_i++;  
                   $einzelseiten = str_replace ('\r\n', '', $einzelseiten);  
                   $this->MultiCell( 200, 4,"$einzelseiten", 0, 'J', 0);  
                   if ($arr_i != count($text1_seiten)) {  
                      $this->AddPage();  
                   }  
                }  
             } else {  
                $this->MultiCell( 200, 4,"$text1", 0, 'J', 0);  
             }  
          }  
          
          

          Im besten Fall tauschst du noch einige globale Variablen durch Parameter. Ich glaube zwar nicht dass das deine Intention ist, aber du hast am Ende eine Funktion, die sich mit nur einer Zeile aufrufen lässt.

          Bevor du dich an die Implementation einer Methode wagst, sollst du dir im klaren darüber sein was diese anstellt. Welche Parameter nimmt sie entgegen, welche Parameter werden per Referenz übertragen, soll die Methode einen Rückgabewert haben, wenn ja welchen, usw. Also eine Spezifikation bereit haben, muss ja nicht unbedingt in schriftlicher Form sein, aber zumindest vor deinem geistigen Auge solltest du sie sehen können. Und das wollte ich eigentlich hören.

          PS: Der Pfeil ist übrigens ein Operator um Methoden von Objekt-Instanzen anzusprechen. Vor dem Pfeil steht also eine Objekt-Instanz.

          1. Du schreibst nur, dass du den Code in eine Funktion packen möchtest und Probleme mit dem Rückgabewert hast.

            Da reicht im Prinzip schon:

            Ui!
            Das wußte ich nicht. Klasse!

            PS: Der Pfeil ist übrigens ein Operator um Methoden von Objekt-Instanzen anzusprechen. Vor dem Pfeil steht also eine Objekt-Instanz.

            Genau diesen Namen habe ich gesucht.

            Die Funktion funktioniert übrigens sehr gut, aufgerufen durch meinen Einzeiler.

            Aber ein Problem bleibt. Nämlich das Zuweisen der Objektinstanzvariablen.

            whatever($my_text,"this"); #Funktion aufrufen  
              
            function whatever($text,$objektinstanz) {  
            echo $$objektinstanz;   #gibt nichts aus  
            echo ${$objektinstanz}; #gibt nichts aus  
            }
            

            Gruß, Kai

            1. Hi,

              whatever($my_text,"this"); #Funktion aufrufen

              function whatever($text,$objektinstanz) {
              echo $$objektinstanz;   #gibt nichts aus
              echo ${$objektinstanz}; #gibt nichts aus
              }

                
              Kommt drauf an, inwiefern die Klasse von $this die Methode \_\_toString implementiert hat. An sich sollte das Funktionieren, auch wenn es SEHR HÄSSLICHER CODE ist.  
                
              Rufe whatever direkt mit $this auf (`whatever($my_text, $this)`{:.language-php}, dann kannst du in whatever direkt $objektinstanz->... nutzen ohne zusätzliche "Dereferenzierung".  
                
              Bis die Tage,  
              Matti
              
              -- 
              [Webapplikationen in C++ entwickeln](http://tntnet.org/)
              
              1. Hi Matti,

                An sich sollte das Funktionieren, auch wenn es SEHR HÄSSLICHER CODE ist.

                Warum ist das sehr hässlich?

                Funktioniert hätte übrigens echo ("$$objektinstanz");   #gibt etwas aus, aber dann meckert php, weil ich $this irgendwie falsch benutze. Leider habe ich die Fehlermeldung nicht mehr im Clipboard. Und im Code zurück gehen, um die Fehlermeldung zu reproduzieren möchte ich nicht, weil

                Rufe whatever direkt mit $this auf (whatever($my_text, $this), dann kannst du in whatever direkt $objektinstanz->... nutzen ohne zusätzliche "Dereferenzierung".

                nämlich genau dieser Tip zum Erfolg führte und jetzt alles so funktioniert, wie ich wollte :-)

                Danke an Dich und 1UnitedPower für die Hilfe.

                Kai

                1. Leider habe ich die Fehlermeldung nicht mehr im Clipboard. Und im Code zurück gehen, um die Fehlermeldung zu reproduzieren möchte ich nicht, weil

                  Aber die Suchmaschinenseite war noch geöffnet. Die Fehlermeldung war
                  Fatal error: Using $this when not in object context
                  Gruß, Kai

              2. Hi,

                whatever($my_text,"this"); #Funktion aufrufen

                function whatever($text,$objektinstanz) {
                echo $$objektinstanz;   #gibt nichts aus
                echo ${$objektinstanz}; #gibt nichts aus
                }

                
                >   
                > An sich sollte das Funktionieren  
                  
                Diese Aussage ist natürlich Käse, wie mir jetzt auffällt.  
                Innerhalb von whatever ist natürlich $this, auf das du zugreifst, natürlich nicht definiert. Dazu passt auch die Fehlermeldung, die du bekommst.  
                  
                Bis die Tage,  
                Matti
                
                -- 
                [Webapplikationen in C++ entwickeln](http://tntnet.org/)
                
  2. Hi,

    function functionsname($text, $wieheißtdasvordempfeileigentlich);

    
    >   
    > Wäre klasse, wenn die Funktion dann selbstständig "die Arbeit" verrichtet,die hier gefragt ist.  
    > Die Arbeit = Prüfen, ob ### vorkommt, wenn ja, dann einen Seitenumbruch im PDF erzeugen.  
    >   
    > Da ich manchmal $this-> und manchmal $pdf-> benutze, würde ich das $wieheißtdasvordempfeileigentlich gerne als Parameter übergeben.  
      
    Hier spielen mehrere Dinge zusammen.  
      
    Du definierst die Funktion so, dass als ein Parameter (in deinem Beispiel der zweite) das FPDF-Objekt übergeben wird, und nennst es z.B. $pdf.  
    Innerhalb der Funktion rufst du dann AddPage/MultiCell/etc dann auf $pdf auf.  
    Das PDF-Objekt brauchst du nicht zurückgeben, da Standardmäßig in PHP Objekte "by reference" übergeben werden (und nicht "as value"/als Kopie), so dass du innerhalb der Funktion dann einfach das originale PDF-Objekt bearbeitest und nicht eine Kopie.  
      
    Je nachdem, von wo du die Funktion aufrufst, übergibst du $pdf oder $this (halt die Variable, die das PDF-Objekt enthält, auf dem du die Funktion aufrufen willst).  
      
    Bis die Tage,  
    Matti
    
    -- 
    [Webapplikationen in C++ entwickeln](http://tntnet.org/)