Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Meine erste Klasse

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Meine erste Klasse

    Hallo allesamt

    da ich langsam mal anfangen muss OOP zu lernen hab ich mir gedacht bau ich meine Screenshot.php etwas um ( vorher war alles ohne ne klasse)

    PHP-Code:
    <?php

    define 
    ('UPLOAD_DIR''images/');

    $sAction '';

    if (isset(
    $_POST['imgBase64']) && $_POST['imgBase64'] != '') {
        
    $sAction $_POST['imgBase64'];
    }

    if (
    $sAction != 'data:,' || $sAction != 0) {

        
    $upl = new PacketFoto($sAction);
        return 
    true;
    } else {
        echo 
    'Es wurden keine Daten &Uuml;bermittelt.';
        return 
    false;
    }

    class 
    PacketFoto
    {

        public function 
    __construct()
        {
            if (!isset(
    $_POST['imgBase64']) || !is_array($_POST['imgBase64'])) {
                
    $this->machFoto();

                return 
    true;
            }
            else{
                echo 
    'Fehler im constructor.';
                return 
    false;
            }
        }

        private function 
    bearbeiteFoto()
        {

            
    $bImg $_POST['imgBase64'];
            if (
    $bImg !=  'data:,' || $bImg != 0){
            
    $bImg str_replace('data:image/png;base64,'''$bImg);
            
    $bImg str_replace(' ''+'$bImg);
            
    $sData base64_decode($bImg);
            
    $sFile UPLOAD_DIR 'paket.png';
            
    $success file_put_contents($sFile$sData);

            return 
    $success;
            }
            else{
                echo 
    'Es wurde kein Bild erzeugt.';
                return 
    false;
            }
        }

        private function 
    machFoto()
        {
            
    $sTakePic $_POST['imgBase64'];
            if (
    $sTakePic != 'data:,' || $sTakePic != 0) {

                
    $this->bearbeiteFoto();
                return 
    true;
            } else {
                echo 
    'Es gab ein Fehler in der Function machFoto';
                return 
    false;
            }
        }

    }
    Das ist meine erste (wirklich!) klasse die ich selbst erstellt habe. Hat mich fast eine Stunde aufgehalten das zu Bauen Wäre das in Ordnung so?Fehlt irgendwas?Oder ist es einfach nur zu viel nur für diese eine Aufgabe?
    Ich hoffe das ist in Ordnung das ich das hier Poste. Ich hab kein Problem mit den Functionen selbst, alles geht so wie es soll, ich wollte mal nur fragen ob das so gut aufgebaut ist für OOP?
    Ich programmiere erst seid neustem(1-2 Monate) und ich hab immer noch Probleme damit zu verstehen wie man Variable weitergibt. ich hab z.b da die Function machFoto. Vorher hab ich ja $sAction mit dem _POST befüllt, wie kann ich nun $sAction an machFoto übergeben und dort in eine Variable speichern?Einfach so $this->machFoto($sAction)? Wenn ja wie fange ich sie unter machFoto auf und tu sie in eine Variable?
    Zurzeit befülle ich ja in jeder Function _POST neu in eine Variable.


  • #2
    mit den tests, ob $_POST['imgBase64'] belegt ist oder was es ist, stimmt was glaub ich nicht.

    Kommentar


    • #3
      - Eine Klasse ist noch lange kein OOP

      - nicht globale Variabeln verwenden (POST) dafür gibt es eigenschaften (Klassenmember) die man zb mit getter und setter (-> google) in die methoden übergibt. Alleine ein $obj->bearbeiteFoto() sagt halt so gar nichts aus

      - Ein Konstruktor gibt nichts zurück, du könntest eine exeption werfen ...

      - ... bzw. du solltest generell Exeptions werfen an statt dem hier:
      PHP-Code:
      } else {
                  echo 
      'Es gab ein Fehler in der Function machFoto';
                  return 
      false
      LG
      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        meinst du
        PHP-Code:
        $bImg !=  'data:,' || $bImg != 
        ?
        Das ist ein Problem was ich mit Firefox habe (http://www.php.de/php-fortgeschritte...eichern-2.html) ich Versuche da ein Screenshot von einer Webcam zu machen aber jedes mal wenn ich es versuche kommt data;, an(was bedeutet der Screenshot ist leer) also muss auch dort abgebrochen werden. Ich hab mein Beitrag oben etwas editiert.

        danke hausl ich werde mich mal erkunndigen über diese Punkte. Ja ich weiß das das jetzt kein OOP ist aber wenn man das mit mehreren classen weiterführt dann wird das ja zur OOP. nur hab ich bis jetzt nichts anderes daher so man muss ja irgendwo beginnen seine klassen aufzubaun

        edit: ja ich glaub
        PHP-Code:
         $sTakePic $this->bearbeiteFoto();
                    return 
        $sTakePic
        wäre da richtiger

        wie gesagt ich hab diese $this-> usw noch nie benutz ich versuche mein bestes hier

        Kommentar


        • #5
          PHP-Code:
          // (..)
            
          if (!isset($_POST['imgBase64']) || !is_array($_POST['imgBase64'])) {
                      
          $this->machFoto();
          //(..)
           
          private function machFoto()
              {
                  
          $sTakePic $_POST['imgBase64'];
             } 

          Kommentar


          • #6
            Zitat von Baldry Beitrag anzeigen
            Ja ich weiß das das jetzt kein OOP ist aber wenn man das mit mehreren classen weiterführt dann wird das ja zur OOP
            Siehe dazu: http://www.php.de/php-tipps-2007/437...tml#post337803

            Zitat von dr.e.
            Wie bereits öfter im Forum diskutiert ist OOP (objektorientierte Programmierung, also eine Klasse schreiben) nicht wirklich OO, wenn man sich vorher kein Konzept (=OOD) überlegt hat.

            Ein paar Worte zu OOD:
            Objektorientierung geht von einem Ansatz aus, Dinge, wie in der Natur zu beschreiben. Ein Mensch hat nicht nur Eigenschaften (Attribute), sondern hat auch Funktionen (Methoden), die Eigenschaften zeigen oder gewisse Dinge tun. Da ein Mensch in natura auch ein Ganzes ist, würde ein Mensch in der objektorientierten Welt auch ein Objekt (z.B. Kunde) sein. Ebenso gibt es Unterschiede zwischen Objekttypen. Einerseits existieren Daten-Objekte, wie der Kunde, die lediglich Daten halten und wenige Methoden haben, andererseits gibt es Logik-Objekte (z.B. Business-Schicht), die die Ablauf-Logik einer Applikation beinhalten. Von letzteren gibt es eine Vielzahl von "Unter-Typen", auf die ich nicht genauer eingehen möchte.

            Essenz aus meinem Beitrag sollte sein, dass der Weg zu OOP nur über OOD und der dazugehörigen Literatur führen kann.
            LG
            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              Ich Glaub ich hab das mit den ganzen this-> immernoch nicht ganz verstanden

              PHP-Code:
              <?php

              define 
              ('UPLOAD_DIR''images/');

              $sAction '';

              if (isset(
              $_POST['imgBase64']) && $_POST['imgBase64'] != '') {
                  
              $sAction $_POST['imgBase64'];
              }

              if (
              $sAction != 'data:,' || $sAction != 0) {

                  
              $upl = new PacketFoto($sAction);
                  
                  return 
              $upl;
              } else {
                  echo 
              'Es wurden keine Daten &Uuml;bermittelt.';
                  return 
              false;
              }

              class 
              PacketFoto
              {

                  public function 
              __construct()
                  {
                      if (!isset(
              $_POST['imgBase64']) || !is_array($_POST['imgBase64'])) {
                          
              $sFoto $this->machFoto();

                          return 
              $sFoto;
                      }
                      else{
                          echo 
              'Fehler im constructor.';
                          return 
              false;
                      }
                  }

                  private function 
              bearbeiteFoto()
                  {

                      
              $bImg $_POST['imgBase64'];
                      if (
              $bImg !=  'data:,' || $bImg != 0){
                      
              $bImg str_replace('data:image/png;base64,'''$bImg);
                      
              $bImg str_replace(' ''+'$bImg);
                      
              $sData base64_decode($bImg);
                      
              $sFile UPLOAD_DIR 'paket.png';
                      
              $success file_put_contents($sFile$sData);

                      return 
              $success;
                      }
                      else{
                          echo 
              'Es wurde kein Bild erzeugt.';
                          return 
              false;
                      }
                  }

                  private function 
              machFoto()
                  {
                      
              $sTakePic $_POST['imgBase64'];
                      if (
              $sTakePic != 'data:,' || $sTakePic != 0) {

                          
              $sTakePic $this->bearbeiteFoto();
                          return 
              $sTakePic;
                      } else {
                          echo 
              'Es gab ein Fehler in der Function machFoto';
                          return 
              false;
                      }
                  }

              }
              etwas umgeändert aber ich muss trotzdem noch sehrviel verbessern glaub ich

              Kommentar


              • #8
                Das hast du ausserhalb deiner Klasse:
                PHP-Code:
                define ('UPLOAD_DIR''images/'); 
                Das in deiner Klasse - Zugriff auf die Konstate:
                PHP-Code:
                class PacketFoto
                   
                //...
                   
                private function bearbeiteFoto() {
                      
                $sFile UPLOAD_DIR 'paket.png';
                   
                // ... 
                Keine solche Magie. Alles was die Klasse braucht muss sie hineingereicht bekommen. Klassen sollten austauschbar sein, und nicht auf "irgendwo vorher" definierte Konstanten oder globals direkt zuzugreifen, sondern eben hineingereicht bekommen.
                (google -> getter / setter bzw. Klasseneigenschaften oder auch (en) "members")
                Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                PHP.de Wissenssammlung | Kein Support per PN

                Kommentar


                • #9
                  ok das hab ich verstanden hausl

                  die zeile sieht nun so aus
                  PHP-Code:
                  $_SERVER['DOCUMENT_ROOT'] . '/images/icons/paket.png'
                  nun zu getter/setter weil das zurzeit das schwerste für mich ist zu verstehen."hineingereicht bekommen" genau das muss ich hinbekommen. vielen danke für die tipps ich hab schon in der letzten stunde gut dazu gelernt

                  Kommentar


                  • #10
                    Die Seite kennst du? http://www.peterkropff.de/site/php/referenzierung.htm
                    Ev. hilfreich. "$this" und "die Sache mit den -> Pfeilen"
                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      Wenn ich das richtig verstanden habe sollte mein Code nun so richtig sein(ich geben die Variabeln weiter so wie ich denke das es richtig ist)
                      PHP-Code:
                      <?php



                      $sAction 
                      '';

                      if (isset(
                      $_POST['imgBase64']) && $_POST['imgBase64'] != '') {
                          
                      $sAction $_POST['imgBase64'];
                      }

                      if (
                      $sAction != 'data:,' || $sAction != 0) {

                          
                      $upl = new PacketFoto($sAction);

                          return 
                      $upl;
                      } else {
                          echo 
                      'Es wurden keine Daten &Uuml;bermittelt.';
                          return 
                      false;
                      }

                      class 
                      PacketFoto
                      {

                          public function 
                      __construct($sTakePic)
                          {
                              if (!isset(
                      $_POST['imgBase64']) || !is_array($_POST['imgBase64'])) {
                                  
                      $sFoto $this->machFoto($sTakePic);

                                  return 
                      $sFoto;
                              }
                              else{
                                  echo 
                      'Fehler im constructor.';
                                  return 
                      false;
                              }
                          }

                          private function 
                      bearbeiteFoto($bImg)
                          {

                              if (
                      $bImg !=  'data:,' || $bImg != 0){

                              
                      $bImg str_replace('data:image/png;base64,'''$bImg);
                              
                      $bImg str_replace(' ''+'$bImg);
                              
                      $sData base64_decode($bImg);
                              
                      $sFile $_SERVER['DOCUMENT_ROOT'] . 'images/paket.png';
                              
                      $success file_put_contents($sFile$sData);

                              return 
                      $success;
                              }
                              else{
                                  echo 
                      'Es wurde kein Bild erzeugt.';
                                  return 
                      false;
                              }
                          }

                          private function 
                      machFoto($sTakePic)
                          {

                              if (
                      $sTakePic != 'data:,' || $sTakePic != 0) {

                                  
                      $sFoto $this->bearbeiteFoto($sTakePic);
                                  return 
                      $sFoto;
                              } else {
                                  echo 
                      'Es gab ein Fehler in der Function machFoto';
                                  return 
                      false;
                              }
                          }

                      }
                      als nächstes würde ich dann diese punkte von dir angehen


                      - Ein Konstruktor gibt nichts zurück, du könntest eine exeption werfen ...

                      - ... bzw. du solltest generell Exeptions werfen an statt dem hier:

                      da muss ich erstmal schauen was exeptions überhaupt genau sind.

                      vielen dank ich hoffe auf ne antwort ob ich nun die zeiger richtig benutz habe

                      Kommentar


                      • #12
                        Hab gerade nich viel zeit, aber jedenfalls hat dein __construct() immer noch ein return. Ein Konstruktor gibt aber nichts zurück.

                        http://professionelle-softwareentwic...estructor.html

                        In PHP hat die Konstruktormethode den Namen __construct. Sie kann eine beliebige Anzahl von Parametern akzeptieren, einen Rückgabewert kann sie jedoch nicht zurückgeben.
                        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                        PHP.de Wissenssammlung | Kein Support per PN

                        Kommentar


                        • #13
                          Das Problem an deiner Klasse sie ist nicht Opbjektorientiert. Das ist einfach Spaghetti-Code in einer Klasse portioniert.

                          Lass uns das mal zerlegen, der Programmablauf sieht so aus:
                          -du bekommst eine DataUrl übergeben
                          -du willst das Bild aus dieser DataUrl extrahieren
                          -du willst das Bild speichern

                          Damit haben wir folgende Objekte:

                          DataUrl = Objekt
                          Bild = Objekt
                          speichern -> erforder Speicher -> Speicher = Objekt

                          Natürlich muss das nicht alles als Klassen abgebildet werden, nur das was "sinn" macht. In dem Fall wäre das die DataUrl und vielleicht der "Speicher".

                          DataUrl: (auslesen und erstellen von DataUrls)

                          PHP-Code:
                          class DataUrl {
                              protected 
                          $encoding 'base64';
                              protected 
                          $mine_type null;
                              protected 
                          $data null;

                              public function 
                          setDataUrl($data_url) {
                                  
                          //auseinader nehmen        
                                  
                                  
                          $this->encoding ENCODING_AUS_DER_URL;
                                  
                          $this->mine_type MINE_TYPE_AUS_DER_URL;
                                  
                                  
                          $this->data self::decode($this->encodingDATA_AUS_DER_URL);
                                  
                                  if(
                          irgend_wo_fehler) {
                                      throw new 
                          Exception('malformed DataUrl');
                                  }                
                              }

                              public function 
                          getDataUrl() {
                                  return 
                          'DATA:'.$this->mine_type.':'.$this->encoding.':'.self::encode($this->encoding$this->getData());
                              }
                              
                              public function 
                          setData($data) {
                                  
                          $this->data $data;
                              }
                              
                              public function 
                          getData() {
                                  return 
                          $this->data;
                              }
                              
                              
                          //setter/getter mine_type
                              //setter/getter encoding
                              
                              
                          protected static encode($encoding$data) {
                                  switch(
                          $encoding) {
                                      case 
                          'base64':
                                          return 
                          base64_encode($data);
                                      default:
                                          throw new 
                          Exception('unkown encoding');            
                                  }    
                              }
                              
                              protected static 
                          decode($encoding$data) {
                                  switch(
                          $encoding) {
                                      case 
                          'base64':
                                          return 
                          base64_decode($data);
                                      default:
                                          throw new 
                          Exception('unkown encoding');            
                                  }
                              }

                          Verwendung:

                          PHP-Code:
                          if (isset($_POST['imgBase64']) && $_POST['imgBase64'] != '') {
                              
                              try {
                                  
                          $data_url = new DataUrl();
                                  
                          $data_url->setDataUrl($_POST['imgBase64']);
                                  
                                  
                          $picture $data_url->getData();
                                  
                                  
                          //kontrollieren ob bild!? oder doch schlampen
                                  
                                  
                          file_puts_content('pfad/upload.png'$picture);
                              } catch (
                          Exception $e) {
                                  echo 
                          'neh kapput';
                              }

                          Das kann man dann noch weiter spinnen. Z.B. wenn oft Bilder über data_urls übertragen werden könnte man auch eine DataUrlPicture Klasse erstellen, die u.a. prüft ob es ein valides Bild ist. Wobei dabei aufgepasst werden muss, dass nicht zu viel funktionalität dort reinschwapt die in einer Image Klasse besser aufgehoben wären.

                          PHP-Code:
                          class DataUrlPicture extends DataUrl {
                              protected 
                          $image_type null;
                              
                              public function 
                          setDataUrl($data_url) {
                                  
                          parent::setDataUrl($data_url);
                                  
                                  
                                  
                          $size getimagesize($this->getData()); //das geht nicht so einfach, dazu müsste man die daten erst in ein stream scheiben
                                  
                                  
                          if(!$size) {
                                      throw new 
                          Exception('invalid picture');
                                  }
                                  
                                  
                          $this->image_type $size[2];
                              }
                              
                              public function 
                          getImageType() {
                                  return 
                          $this->image_type;
                              }

                          Verwendung:

                          PHP-Code:
                          if(isset($_POST['imgBase64']) && $_POST['imgBase64'] != '') {
                              
                              try {
                                  
                          $data_url = new DataUrlPicture();
                                  
                          $data_url->setDataUrl($_POST['imgBase64']);
                                  
                                  
                          $picture $data_url->getData();
                                  
                                  
                          file_puts_content('pfad/upload.png'$picture);
                              } catch (
                          Exception $e) {
                                  echo 
                          'neh kapput';
                              }


                          Und noch mal auf den Speicher zurückzukommen. So wie ich das rausgelesen habe ist das die Upload funktion von einem Webcam Viewer? Damit hättest du das Objekt WebcamViewer was eine Upload funktion hat.


                          PHP-Code:
                          class WebcamViewer {
                              protected 
                          $image_path null;
                              
                              public function 
                          uploadImage($image) {
                                  
                          $status file_get_contents($image_path.'/last.png'$image);
                                  if(!
                          $status) {
                                      throw new 
                          Exception('....');
                                  }    
                              }
                              
                              public function 
                          setImagePath($path) {
                                  
                          $this->image_path $path;
                              }

                          Verwendung:

                          PHP-Code:
                          if(isset($_POST['imgBase64']) && $_POST['imgBase64'] != '') {
                              
                              try {
                                  
                          $data_url = new DataUrlPicture();
                                  
                          $data_url->setDataUrl($_POST['imgBase64']);
                                  
                                  
                          $picture $data_url->getData();
                                  
                                  
                          $webcam = new webcamViewer();
                                  
                          $webcam->setImagePath('pfad/');
                                  
                          $webcam->uploadImage($picture);
                              } catch (
                          Exception $e) {
                                  echo 
                          'neh kapput';
                              }


                          Diesen Funktionsablauf könnte man jetzt auch noch Objektorientiert abbilden, aber das wird dann schon ziemlich abstrakt und recht Code intensiv.

                          PS: alles Beispiel Code!

                          Kommentar


                          • #14
                            Vielen dank das ist jetzt schon soviel das ich erstmal alles durchlesen und verstehen muss da ich grad bei der arbeit bin muss ich auch noch andere sachen machen aber sobald ich zeit hab gehe ich alles durch und melde mich wieder

                            vielen dank

                            So bin nun das meiste durch

                            @erc ich habs mir nun genauer angesehen und verstehe sogar alles Ich werde versuchen diese Form beizubehalten. Mein nächstes Projekt sieht dann hoffendlich besser aus.
                            Also die klasse ist für den Upload eines Bildes verantwortlich. das Bild wird im Javascript erstellt (was zurzeit NUR! unter Chrome geht und ich brauch es aber unter firefox ) aber das hat nichts mit der php datei zutun,
                            weil diese ging auch schon vorher (unter chrome) also liegt der fehler beim js unter Firefox. was mir nur aufgefallen ist das es möglich ist auf denn stream rechtsklick zu machen und das bild was grad da ist abzuspeichern. wäre es möglich das irgendwie auch über php auszuführen?weil ich unter firebug nichts sehe wenn ich das bild mit rechtsklick abspeichere.

                            @hausl danke hab denn return wieder rausgenommen und verstehe auch wieso, danke.

                            Kommentar

                            Lädt...
                            X