Ankündigung

Einklappen
Keine Ankündigung bisher.

Frage zu Methoden und return

Einklappen

Neue Werbung 2019

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

  • Frage zu Methoden und return

    Ich habe mir vor kurzem mit PHP eine kleine Klasse gebastelt, die verschiedene Methoden zum Lösen von quadratischen Gleichungen bietet.
    Hier mal eine davon:

    PHP-Code:
        public function solvePQ($p,$q) {
            
    $this->$p;
            
    $this->$q;
            
    $d sqrt(($p 2) * $q);
            
            if (
    $d 0) {
                
    $errormsg 'noresults';
                
    $x $this->handleError($errormsg);
                return 
    $x;
            }
            else {
                
    $x1 = -$p $d;
                
    $x2 = -$p $d;
                return 
    $x1;
                return 
    $x2;
            }
        } 
    Nun ein kleines Anwendungsbeispiel:

    PHP-Code:
    $QuadSolver = new QuadSolver();
    $results $QuadSolver->solveABC(-2,6,8);
    echo 
    $results
    Das Problem ist nur, dass die Klasse mir nur die Variable $x1 zurückgibt, die in diesem Fall den Wert -1 enthält. Die Variable $x2 wird allerdings nicht zurückgegeben, gibt es eine Möglichkeit die auch noch irgendwie mit auszugeben?
    Ich habe es schon mit einem Array versucht, aber das ist erstens nicht so wie ich es eigentlich will und zweitens klappt es auch nicht wirklich.

  • #2
    Kannst immer nur eine Variable mit return zurück geben. Beim 1. return springt er aus der Funktion zurück.

    Könntest ein Array zurückgeben:
    PHP-Code:
    function foo($x$y) {
      return array(
    $x 1$y 2);
    }

    list(
    $a$b) = foo(12); 
    Grüße.

    Kommentar


    • #3
      Du kannst mit return immer nur eine Variable zurückgeben.
      Wenn du mehrere Werte zurückgeben willst, ist also ein Array oder eine ähnliche Datenstruktur das, was du zurückgeben willst.

      Und das „klappt nicht wirklich“ keine Problembeschreibung, sondern Mist ist - muss das jetzt schon wieder extra erwähnt werden?

      Kommentar


      • #4
        P.S. es kommt zu dem zweiten return nicht, weil return auch die Funktion beendet, wie exit; das ganze Script beenden würde.

        Kommentar


        • #5
          In klassen kannst du das ergebnis doch speichern und das ergebnis dann mit getX1() und getX2() abrufen.
          Oder:
          PHP-Code:
          function foo($xin$yin, &$xout, &$yout) {
          $xout $xin 1;
          $yout $yin 2;
          }

          foo(56$x$y);
          echo 
          $x.'/'.$y

          Kommentar


          • #6
            aber deine Funktion da oben .. ist Bockmist

            das Ergebnis der Quadratwurzel KANN niemals kleiner als 0 sein - da php nunmal nicht mit imaginären Zahlen rechnet (jedenfalls nicht ohne geeignete Klasse / Funktion)

            du musst VORHER prüfen, ob die Quadratwurzel überhaupt erlaubt ist - sonst steigt dir dein Script mit nem Fehler aus

            DU müsstest prüfen, wie der Wert p² − 4*q beschaffen ist
            - positiv und größer als 0 -> 2 Reale Nullstellen
            - 0 -> 1 Reale Nullstelle
            - negativ -> 2 Nullstellen im Bereich der Komplexen Zahlen
            [imaginäre Zahlenebene z= Realteil + i * Imaginär-Teil mit i = sqrt(-1) ]

            Kommentar


            • #7
              Obwohl alle gegebenen Antworten korrekt sind, unterstelle ich mal Mutmassung:
              PHP-Code:
                  public function solvePQ($p,$q) {
                    ...
                  } 
              PHP-Code:
              $results $QuadSolver->solveABC(-2,6,8); 

              Kommentar


              • #8
                ja Arne , wir gehen mal davon aus, dass die aufgerufene Methode frei nach Wikipedia aus den Parametern

                f(x)=Ax²+Bx+C die sogenannte Normalform f(x)=x²+px+q errechnet ...

                p=B/A, q=C/A

                was aber am grundsätzlichen Problem nicht viel ändert - man betrachtet die sogenannte "Diskriminante" der Gleichung -> p²-4q und kann daran die Anzahl und Lage der Nullstellen abschätzen

                und wie oben gesagt, per return kann immer nur EINE Variable zurückgegeben werden - das kann durchaus auch ein Objekt oder Array sein, das dann mehrere Einzelwerte enthält

                Kommentar


                • #9
                  Ich wollte eigentlich nur darauf hinweisen, daß der TE nicht den passenden Aufruf der zugehörigen Klassen-Methode gepostet hat...

                  Kommentar


                  • #10
                    Zitat von Arne Drews Beitrag anzeigen
                    Obwohl alle gegebenen Antworten korrekt sind, unterstelle ich mal Mutmassung:


                    Stimmt, die komplette Klasse sieht bei mir so aus (ich hab mir aber alles ganz schön kompliziert zusammengestrickt, sodass ich mittlerweile aufgegeben habe weiter dran zu arbeiten):

                    PHP-Code:
                    <?php
                    class QuadSolver {

                        private function 
                    handleError($errormsg) {
                            
                    $this->errormsg $errormsg;
                            
                            if (
                    $errormsg == 'zero') {
                                
                    $error 'Divide by zero! Please check your values.';
                                return 
                    $error;
                            }
                            if (
                    $errormsg == 'noresults') {
                                
                    $error 'The equation hasn\'t got a result!';
                                return 
                    $error;
                            }
                        }

                        public function 
                    solveABC($a$b$c) {
                            
                    $this->$a;
                            
                    $this->$b;
                            
                    $this->$c;
                            
                    $d $b $b $a $c;
                            
                            if (
                    $a == 0)  {
                                
                    $errormsg 'zero';
                                
                    $x $this->handleError($errormsg);
                                return 
                    $x;
                            }
                            else {
                                if (
                    $d 0) {
                                    
                    $errormsg 'noresults';
                                    
                    $x $this->handleError($errormsg);
                                    return 
                    $x;
                                }
                                if (
                    $d == 0) {
                                    
                    $x = -$b / ($a);
                                    return 
                    $x;
                                }
                                if (
                    $d 0) {
                                    
                    $x1 = (-$b sqrt($d)) / ($a);
                                    
                    $x2 = (-$b sqrt($d)) / ($a);
                                    
                    $x = array($x1$x2);
                                    return 
                    $x;
                                }
                            }
                        }
                        
                        public function 
                    solvePQ($p$q) {
                            
                    $this->$p;
                            
                    $this->$q;
                            
                    $d sqrt(($p 2) * ($p 2) - $q);
                            
                            if (
                    $d 0) {
                                
                    $errormsg 'noresults';
                                
                    $x $this->handleError($errormsg);
                                return 
                    $x;
                            }
                            else {
                                
                    $x1 = -$p $d;
                                
                    $x2 = -$p $d;
                                
                    $x = array($x1$x2);
                                return 
                    $x;
                            }
                        }

                    }

                    $QuadSolver = new QuadSolver();
                    $x $QuadSolver->solvePQ(-2,3);
                    echo 
                    $x;

                    ?>
                    Wie ihr sehen könnt, habe ich nun ein Array zurückgeben lassen, nur ist das nicht besonders günstig. Eine quadratische Gleichung kann ja keine, eine oder zwei Lösungen haben und woher soll der Endbenutzer wissen, ob er das Ergebnis nun mit echo $x; ausgeben soll oder beispielsweise mit echo $x[2];?
                    Das hängt ja ganz von den gegebenen Werten ab.
                    Außerdem will die Methode handleError noch nicht so funktionieren, wie sie es sollte. z.B. gibt die Klasse bei solvePQ(-2,3) den Wert NAN (also "not a number") zurück, obwohl sie "The equation hasn't got a result!" zurückgeben müsste, bin mit meiner Logik also so ziemlich am Ende.
                    Nebenbei muss ich auch sagen, dass es meine erste OOP-Klasse in PHP ist.

                    Kommentar


                    • #11
                      Zitat von Anima Beitrag anzeigen
                      Eine quadratische Gleichung kann ja keine, eine oder zwei Lösungen haben und woher soll der Endbenutzer wissen, ob er das Ergebnis nun mit echo $x; ausgeben soll oder beispielsweise mit echo $x[2];?
                      Das hängt ja ganz von den gegebenen Werten ab.
                      Auf die Idee, immer ein Array zurückzugeben, das keinen, einen oder zwei Werte enthält, bist du nicht gekommen?

                      Kommentar


                      • #12
                        also erstmal bist du selbst nutzer deiner eigenen Klasse - solchen "Klassen" würde ich keinem anderen andrehen wollen
                        zweitens gehört es schließlich in die Dokumentation, wie die Rückgaben aussehen
                        und drittens - du könntest wenigstens für den Fall das überhaupt Nullstellen existieren (ich weise nochmal darauf hin - deine Diskriminante für die p q Variante ist FALSCH!!!!) in jedem Falle ein Array zurückliefern - im Array steckt dann
                        a) 2 Werte => 2 Reale Nullstellen
                        b) 1 Wert => 1 Reale Nullstelle (eigentlich ja korrekter "die beiden Nullstellen fallen auf die gleiche Koordinate" )

                        dann kann der Aufrufer anhand eines Count recht einfach feststellen, wieviele Nullstellen denn drin sind, nachdem er den Sonderfall - du gibst halt analog zu vielen PHP-Funktionen ein FALSE zurück - explizit ausgeschlossen hat = keine Nullstelle

                        Kommentar


                        • #13
                          Die Diskriminante von der PQ-Formel berechnet man doch mit D = (p/2)² - q, oder?
                          Bzw. die "Mitternachtsformel" müsste doch lauten:
                          x(1,2) = -p/2 +- sqrt((p/2)² - q)
                          Entweder du liegst falsch oder ich habe in Mathe geschlafen.

                          Naja ich werde das mit dem Array noch ausbessern.

                          Kommentar


                          • #14
                            PHP-Code:
                            // no result / false
                            return array(); 
                            PHP-Code:
                            // 1 result "row"
                            return array($x); 
                            PHP-Code:
                            // 2 result "rows"
                            return array($x1,$x2); 
                            alternativ:
                            PHP-Code:
                            class solverResult {
                               protected 
                            $data=array();
                               public function 
                            __construct() {
                                  foreach ( 
                            func_get_args() as $arg ) {
                                     if ( 
                            is_numeric($arg) ) $data[] = $arg;
                                  }
                               }

                               public function 
                            __toString() {
                                  if ( 
                            count($this->data) > )
                                     return 
                            join(' '$this->data);
                                  else (string)new 
                            emptySolverResult();
                               }

                               public function 
                            each() {
                                  return 
                            $this->data;
                               }
                               
                               public function 
                            getNth($pos) {
                                  if ( 
                            is_numeric($pos) ) {
                                     
                            $pos = (integer)$pos;
                                     return 
                            array_key_exists($pos$this->data) ? $this->data[$pos] : null;
                                  }
                                  else return 
                            null;
                               }
                            }

                            class 
                            emptySolverResult extends solverResult {
                               public function 
                            __toString() {
                                  return 
                            'NAN'// not a number == empty result
                               
                            }

                            Usage:
                            PHP-Code:
                            // no result - alternate 1
                            return new emptySolverResult();

                            // no result - alternate 2
                            return new solverResult(); 
                            PHP-Code:
                            // 1 result "row"
                            return new solverResult($x); 
                            PHP-Code:
                            // 2 result "rows"
                            return new solverResult($x1,$x2); 
                            result usage:
                            PHP-Code:
                            $a = new QuadSolver();
                            echo (string)
                            $a->solvePQ(10,20); 
                            als alternative

                            Kommentar

                            Lädt...
                            X