Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Strict Standards: Declaration of Database::prepare() should be compatible

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Strict Standards: Declaration of Database::prepare() should be compatible

    Ich wollte mit method chaining arbeiten und habe meine Datenbankklasse von PDO erben lassen. Die Methode prepare sieht so aus:
    PHP-Code:
        public function prepare($statment, array $options = array())
        {
            try {
                
    $this->statement parent::prepare($statement$options);
            }
            catch(
    PDOException $e){
                throw new 
    Exception($e->getMessage());
            }
            return 
    $this;
        } 
    Ich bekomme diese im Betreff genannte Fehlermeldung. Ist es wegen dem Rückgabetyp? Oder wo liegt mein Fehler.

    Danke für die Hilfe.

    ====================

    Fehler gefunden. Das Type Hinting im Parameter weglassen. Also:
    PHP-Code:
        public function prepare($statment$options = array())
        {
            try {
                
    $this->statement parent::prepare($statement$options);
            }
            catch(
    PDOException $e){
                throw new 
    Exception($e->getMessage());
            }
            return 
    $this;
        } 

  • #2
    Dein Rückgabewert ist nicht sinnvoll, denn du gibst ja nicht das Statement zurück.
    [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

    Kommentar


    • #3
      So ist das bei Chaining nunmal.
      [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


      • #4
        Bei gleicher Methodensignatur und unterschiedlichem Rückgabewert entsteht eine Ambiguität. Im Prinzip hast du dann zwei Funktionen, die der Elternklasse und die der Kindklasse, die sich aber nur im Rückgabetyp unterscheiden.
        Welche Methode soll aufgerufen werden, wenn die Parameter (inklusive Typ) gleich sind, die Rückgabewerte aber unterschiedlich?
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Zitat von lstegelitz Beitrag anzeigen
          Im Prinzip hast du dann zwei Funktionen, die der Elternklasse und die der Kindklasse, die sich aber nur im Rückgabetyp unterscheiden.
          Das ist ja beabsichtigt. Ich will die Funktionalitäten der Elternmethode mit einem neuen Rückgabewert (Objekt meiner Datenbankklasse, also $this) kombinieren, um das Chaining anwenden zu können.
          Zitat von lstegelitz Beitrag anzeigen
          Welche Methode soll aufgerufen werden, wenn die Parameter (inklusive Typ) gleich sind, die Rückgabewerte aber unterschiedlich?
          Es soll die Methode $Meine_Datenbank_Klasse->prepare(...) aufgerufen werden, welche die Funktionalität der Elternmethode beinhaltet + einen neuen Rückgabetyp, nämlich das Objekt, beinhaltet. Damit sind solche Konstrukte möglich:
          PHP-Code:
          $this->db->prepare($sql)
                   ->
          execute($insert)
                   ->
          fetch(); 

          Kommentar


          • #6
            Zitat von nuna Beitrag anzeigen
            Das ist ja beabsichtigt. Ich will die Funktionalitäten der Elternmethode mit einem neuen Rückgabewert (Objekt meiner Datenbankklasse, also $this) kombinieren, um das Chaining anwenden zu können.
            Das geht aber nicht (so)! Ein Compiler bzw. Parser erkennt eine Funktion nur anhand der Parameter, der Rückgabewert wird nicht beachtet.. daher kann auch nicht unterschieden werden, welche der Funktionen aufgerufen werden soll, das ist Kontextabhängig.

            Wenn du Method-Chaining verwenden willst, musst du einen Wrapper schreiben und alle Aufrufe delegieren.

            Zitat von nuna Beitrag anzeigen
            Es soll die Methode $Meine_Datenbank_Klasse->prepare(...) aufgerufen werden, welche die Funktionalität der Elternmethode beinhaltet + einen neuen Rückgabetyp, nämlich das Objekt, beinhaltet. Damit sind solche Konstrukte möglich:
            PHP-Code:
            $this->db->prepare($sql)
                     ->
            execute($insert)
                     ->
            fetch(); 
            DU weißt, welche Funktion aufgerufen werden soll - du kennst den Kontext auch, den kennt der Parser aber nicht (der Parser prüft nicht, welche Funktion danach per chaining aufgerufen wird - das ist mit Kontext gemeint).
            Der Parser sieht erstmal nur
            PHP-Code:
            $this->db->prepare($sql
            und dafür findet er 2 passende Methoden... wie gesagt, der Rückgabewert interessiert den Parser nicht, er sucht die richtige Funktion anhand der Parameter. Findet er keine, meckert er das an (mit einem Fehler), findet er MEHR als EINE, weiß er nicht mehr was er tun soll und warnt...
            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

            Kommentar


            • #7
              Zitat von nuna Beitrag anzeigen
              PHP-Code:
                  public function prepare($statment, array $options = array())
                  {
                      try {
                          
              $this->statement parent::prepare($statement$options);
                      }
                      catch(
              PDOException $e){
                          throw new 
              Exception($e->getMessage());
                      }
                      return 
              $this;
                  } 
              der try … catch() block ist unnötig, da du lediglich eine PDOException in eine Exception umwandelst, da kannst du die PDOException auch gleich durchlassen.

              Kommentar


              • #8
                Zitat von lstegelitz Beitrag anzeigen
                Der Parser sieht erstmal nur
                PHP-Code:
                $this->db->prepare($sql
                und dafür findet er 2 passende Methoden... wie gesagt, der Rückgabewert interessiert den Parser nicht, er sucht die richtige Funktion anhand der Parameter. Findet er keine, meckert er das an (mit einem Fehler), findet er MEHR als EINE, weiß er nicht mehr was er tun soll und warnt...
                Wenn ich in einer Kindklasse die Methode prepare() einfüge und von PDOStatement erbe dann sollte dem Parser klar sein das ich bei einem Objekt meiner Kindklasse auch die Methode der Kindklasse aufrufen möchte und nicht die der Elternklasse.

                Bzw. ist das Standardverhalten beim überschrieben von Methoden.
                "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

                Kommentar


                • #9
                  Zitat von Dark Guardian Beitrag anzeigen
                  Wenn ich in einer Kindklasse die Methode prepare() einfüge und von PDOStatement erbe dann sollte dem Parser klar sein das ich bei einem Objekt meiner Kindklasse auch die Methode der Kindklasse aufrufen möchte und nicht die der Elternklasse.

                  Bzw. ist das Standardverhalten beim überschrieben von Methoden.
                  Wenn man es richtig macht, ja...
                  Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                  Kommentar


                  • #10
                    Was heißt, wenn man es richtig macht... da PHP kein Überladen von Methoden mit unterschiedlichen Signaturen kennt, ist das durchaus immer der Fall. Hat man die Signatur geändert gibt es eben Fehler, mit Glück nur den beschriebenen E_STRICT.
                    [IMG]https://g.twimg.com/twitter-bird-16x16.png[/IMG][URL="https://twitter.com/fschmengler"]@fschmengler[/URL] - [IMG]https://i.stack.imgur.com/qh235.png[/IMG][URL="https://stackoverflow.com/users/664108/fschmengler"]@fschmengler[/URL] - [IMG]http://i.imgur.com/ZEqflLv.png[/IMG] [URL="https://github.com/schmengler/"]@schmengler[/URL]
                    [URL="http://www.schmengler-se.de/"]PHP Blog[/URL] - [URL="http://www.schmengler-se.de/magento-entwicklung/"]Magento Entwicklung[/URL] - [URL="http://www.css3d.net/"]CSS Ribbon Generator[/URL]

                    Kommentar


                    • #11
                      Zitat von fab Beitrag anzeigen
                      Was heißt, wenn man es richtig macht... da PHP kein Überladen von Methoden mit unterschiedlichen Signaturen kennt, ist das durchaus immer der Fall. Hat man die Signatur geändert gibt es eben Fehler, mit Glück nur den beschriebenen E_STRICT.
                      Wobei die Frage ist warum es Fehler gibt wenn sich die Signatur ändert wenn es (durch fehlende Überladung) sowieso immer dazu kommt.

                      PHP muss hier keine Entscheidung treffen welche Methode aufgerufen wird.

                      Es gibt dann erst ein Problem wenn ich einer Funktion/Methode welche ein PDOStatement erwartet meine Kindklasse übergebe was ja durchaus ligitim ist. Deswgeen ist es wohl auch "nur" ein E_STRICT.
                      "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

                      Kommentar

                      Lädt...
                      X