OOP, Frage zu return

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

  • OOP, Frage zu return

    Hi,

    ich versuche mich gerade an meiner ersten Klasse und bin daher noch etwas unsicher, wie das alles funktioniert.

    Ich möchte eine Image Upload Klasse schreiben.

    Ich übergebe nach dem Upload die Datei an die erste Funktion:

    function imageUpload($ImageFile,$MaxSize)

    Diese Funktion soll den Upload übernehmen, sofern keine Fehler auftauchen. Also:
    PHP-Code:
    if ($this->checkUpload($ImageFile,$MaxSize)== true)
    {
        
    1. generateImageName($originalName);
        
    2. uploadImage($newName);
    }
    else
    {
       
    Fehlermeldungen ausgeben

    Die Funktion checkUpload($ImageFile,$MaxSize) überprüft:

    1. Datei hochgeladen?
    2. Dateigrösse?
    3. Filetype erlaubt?

    wenn ein fehler auftaucht steht dort return false.

    Ich habe nun noch eine weitere Funktion, die die Fehlermeldungen in einem Array enthält.
    Die rufe ich dann jeweils auf. $this ->getError(3);

    Nun versuche ich mit return $this ->$ErrorMsg[$ErrorFlag]; die Fehlermeldungen zurückzugeben und in meiner ersten Funktion imageUpload($ImageFile,$MaxSize) auszugeben. Da kommt aber nichts an.

    In Kurz.

    Funktion imageUpload($ImageFile,$MaxSize)
    ruft
    checkUpload($ImageFile,$MaxSize)
    auf

    checkUpload($ImageFile,$MaxSize)
    ruft wenn mehrer Fehler vorhanden, mehrfach
    function getError($ErrorFlag=NULL,$lang=eng)
    auf

    wie kann ich also die Fehlermeldungen von getError() and imageUpload übergeben?

    Ich hoffe ich habe das einigermassen erklärt und vielleicht hat jemand einen Tip. Würde mich freuen.

    Vielen Dank im Voraus.

    Gruss Luka

  • #2
    Also auf den ersten Blick:

    $this ->$ErrorMsg[$ErrorFlag];

    Variablen in Objekten ($this oder anderen) adressiert man so:

    $this->ErrorMsg[$errorFlag];

    Vielleicht ist das ja schon des Rätsels Lösung.

    Kommentar


    • #3
      Danke für den ersten Tip, daran muss ich in Zukunft natürlich denken. Habe es gerade eingebaut, aber leider funktioniert es immer noch nicht.

      Ich gehe mal davon aus das das Problem das springen von Funktion 1 -> Funktion 2 Funktion 2 -> Funktion 3 und Wert aus Funktion 3 in Funktion 1 ausgeben.

      Echt nicht einfach.

      Gruss Luka

      Kommentar


      • #4
        Hm, ich glaub ich verstehe das Problem nicht ganz, aber eigentlich ganz normal mit Returns!

        Also Funktion 3 gibt an Funktion 2 zurück, Funktion 2 an Funktion 1.

        Wenn mehrere Werte zurückzugeben sind (etwa mehrere Fehlermeldungen), diese entweder in ein Array/Objekt packen oder in einem Array/Objekt in $this ablegen und später auslesen.

        Kommentar


        • #5
          Also eigentlich gibt Funktion 2 nur true oder false an Funktion 1 zurück, ruft aber Funktion 3 auf.

          Funktion 3 dagegen soll ( return $this ->ErrorMsg[$ErrorFlag] die jeweilige Fehlermeldung an Funktion 1 geben.

          Da liegt wohl der Fehler richtig?

          Kommentar


          • #6
            ich würde so vorgehen

            1. eine boole'sche Var für Fehlerzustand (true,false)
            2. eine Array für Fehlermeldung
            3. bei jeder Methode immer

            PHP-Code:

            if (this->_clsOK) {
               
            // die vorgesehene Arbeit durch führen
            } else {
               return 
            false;

            d.h. bei Fehler wird generell

            1. this->_clsOK = false;
            2. this->_clsError[] = ...; // Fehlermeldung erfassen, kann auch in einer Methode gepackt werden

            es gibt dann 2 weitere Methoden

            1. getError liefert Fehlermeldungsarray
            2. resetError löscht alle Fehlermedungen

            Für deinen Uploadeintrag brauchst du nur eine Methode warum denn 3?

            Kommentar


            • #7
              Ich habe 3 Methoden, weil ich die Bereiche klar getrennt habe.

              1. Übernimmt den Upload, oder gibt Fehlermeldung aus

              ruft 2 auf zur Überprüfung

              2. übernimmt die Überprüfung, im Fehlerfall ruft es 3 auf, gibt true oder false an 1 zurück

              3. Dort gibt es das Array für Fehlermeldungen soll Meldungen an Funtkion1 zurückgeben

              Kommentar


              • #8
                Hi,

                leider habe ich immer noch keine Lösung für mein Problem gefunden.

                Hier habe ich nun mal Funktion 2:

                PHP-Code:
                if (empty($ImageFile)) { 
                     
                $ErrorMsg=$this ->getError(1);
                     
                     return 
                $ErrorMsg;
                }
                else
                {
                     return 
                false;

                $ErrorMsg hat die Fehlermeldung aus der Funtkion 3. Ich rufe also Fkt. 2 durch Fkt 1 auf,Fkt 2 überprüft und holt die Fehlermeldung aus Fkt.3

                Nun möchte ich die $ErrorMsg an Funktion 1 zurückgeben, bekomme dort aber nichts ausgegeben.

                FUNKTION 1

                PHP-Code:
                if ($this->checkUpload($ImageFile,$MaxSize)== false)
                {
                    
                // Keine Fehler also werden Funktionen aufgerufen, um Dateinamen zu erstellen etc.
                }
                else{
                   echo  
                $ErrorMsg;   //Fehlermeldung ausgeben

                Natürlich kommt keine Fehlermeldung an, aber ich verstehe einfach nicht warum. Ich rufe das wahrscheinlich falsch auf oder was ist falsch? Ich verstehe es einfach nicht und hoffe auf jeden Tip von Euch.

                Vielen Dank im Voraus.
                Zuletzt geändert von Luka; 17.04.2007, 23:13.

                Kommentar


                • #9
                  PHP-Code:
                  }
                  else
                  {
                       return 
                  false;

                  das false hier passt nicht ganz (ich denke mal das soll true heißen)
                  PHP-Code:
                  if ($error $this->checkUpload($ImageFile,$MaxSize))
                  {
                      
                  // kein Fehler
                  }
                  else{
                    echo 
                  $error;

                  Du kannst die Error Message nicht auslesen da die Variable ja lokal ist und nicht global. Deswegen musst du mit der Rückgabe weiterarbeiten.
                  Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                  Kommentar


                  • #10
                    Genial, danke tontechniker. Das funktioniert schonmal. Jetzt muss ich mich durcharbeiten, damit ich alle Fehlermeldungen bekomme.

                    Hoffentlich schaffe ich es jetzt ohne weitere Probleme. Das das so einfach war, hätte ich fast nicht gedacht. Also, auf an die weiteren Schritte und nochmal vielen Dank.

                    Gruß Luka

                    Kommentar


                    • #11
                      fehlerbehandlung kann man auch sauber machen, z.b. so:
                      PHP-Code:
                      <?php
                      class Uploader {
                        
                      /**
                         * @throws FileTypeNotAllowedException
                         * @throws UploadErrorException
                        */
                        
                      function upload($files) {
                          if (
                      UPLOAD_ERR_OK != $files['error'] ) {
                               throw new 
                      UploadErrorException();
                         }
                         if (!
                      in_array($files['type'], $allowedMimeTypes)) { // wo auch immer das herkommt
                               
                      throw new FileTypeNotAllowedException($files['type']);
                          }
                          
                      // fehler weiterbehandeln
                          // upload ausführen
                        
                      }

                      }

                      $u = new Uploader();
                      try {
                         
                      $u -> upoload($_FILES['file']);
                         echo 
                      "alles ok";
                      } catch (
                      UploadErrorException $e) {
                         echo 
                      "sorry, keine datei hochgeladen";
                      } catch (
                      FileTypeNotAllowedException $e) {
                         echo 
                      "du darfst nur jpg, tiff, etc hochladen!";
                      }
                      fehler-arrays mit nachrichten und fehlercodes sind einfach nur buggy und unwartbar.

                      grüße
                      axo

                      Kommentar


                      • #12
                        @axo,

                        Interessant, habe ich vorher noch nie gesehen. In google steht aber das das nur unter PHP 5 läuft. Mein Provider bietet aber nur PHP 4, also kann ich das jetzt erstmal nicht nutzen. Danke dennoch.

                        fehler-arrays mit nachrichten und fehlercodes sind einfach nur buggy und unwartbar.
                        Das gibt mir zu denken. Warum ist es buggy und unwartbar? Ich meine, bei einer Image Upload Klasse, weiß man doch ganz genau, welche Fehler auftreten können... oder?


                        Der Upload funktioniert jetzt soweit, jetzt bin ich in Phase 2. Eigentlich werden Image Daten immer in einer DB abgelegt. Ich möchte also als nächstes Daten abspeichern. Kann ich so etwas auch in die Image Klasse packen oder sollte man da eine neue Klasse Image_DB erstellen?

                        Ich habe bereits eine DB Klasse zur Verbindung mit der Datenbank, aber ich möchte eigentlich am Ende nur eine Image Klasse haben, die alles kann und die ich nur einbinden muss.

                        Welcher Weg ist da nun ratsam? Hoffe Ihr habt ein paar Ideen. Vielen Dank im voraus.

                        Luka

                        Kommentar


                        • #13
                          Du meinst einbinden wie die mysql-Klasse, so daß sie überall verfügbar ist ? als Singleton ?

                          Das paßt nicht zu OOP.

                          Dann nimm lieber eine Funktionssammlung und include sie.

                          Kommentar


                          • #14
                            Du meinst einbinden wie die mysql-Klasse, so daß sie überall verfügbar ist ? als Singleton ?
                            Das paßt nicht zu OOP.
                            OffTopic:
                            Warum passen Instanzen von Klassen die pro Aufruf nur einmal existieren nicht zu OOP? Bei einer dauerhaft existierenden Datenbankverbindung ist das doch genau richtig.
                            Ich habe bereits eine DB Klasse zur Verbindung mit der Datenbank, aber ich möchte eigentlich am Ende nur eine Image Klasse haben, die alles kann und die ich nur einbinden muss.
                            Genau hier solltest du dir überlegen ob du davon nicht Abstand nimmst. Wenn du eine Klasse programmierst ist doch ein Ziel etwas mehrmals und in unterschiedlichen Situationen verwendbar zu machen. Das hieße in diesem Fall du schreibst eine Datenbank Klasse die du dann in der Uploader Klasse verwendest und zum Beispiel auch für ein News System einsetzen kannst. Wenn du die Bilder (sinnvollerweise) in Dateien speichern willst kannst du das natürlich in die Uploader Klasse einbauen da die Funktionen hier ja passend von PHP gehandelt werden.
                            Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                            Kommentar


                            • #15
                              Warum passen Instanzen von Klassen die pro Aufruf nur einmal existieren nicht zu OOP? Bei einer dauerhaft existierenden Datenbankverbindung ist das doch genau richtig.
                              Natürlich ist das bei der db-Klasse in Ordnung.

                              Kommentar

                              Lädt...
                              X