Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] PDO singleton

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    Hallöchen,

    Zitat von coolio Beitrag anzeigen
    PHP-Code:
    $queryNewUserInsert Database::getInstance()->_db->prepare('INSERT INTO users (firstName, lastName) VALUES("Max", "Mustermann")');
    $queryNewUserInsert->execute(); 
    mal abgesehen davon, dass die Eigenschaft _db, im Ausgangspost, als private deklariert wurde und somit nicht von außen angesprochen werden kann, frage ich mich ernsthaft, welchen Mehrwert du dir von deiner Database-Klasse versprichst.

    Viele Grüße,
    lotti
    [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

    Kommentar


    • #17
      Du hantierst mit Silex, Doctrine und Twig rum und hast nahezu 0 OOP-Verständnis ?

      Datebase::getInstance gibt ein Database-Objekt zurück, Prepare ist aber eine methode von PDO. PDO liegt im privaten property _db.

      PHP-Code:
      <?php

      class Database
      {

          private 
      $pdo;

          private static 
      $instance;

          private function 
      __construct()
          {
              
      $this->pdo = new PDO(/** ... */);
          }

          public static function 
      on()
          {
              if ( ! 
      self::$instance instanceof self ) {
                  
      self::$instance = new self;
              }

              return 
      self::$instance->pdo;
          }

      }

      $foo Database::on()->prepare(/** ... */);
      tut was du willst.

      PHP-Code:
      <?php

      class Database
      {

          private static 
      $container;

          public static function 
      __callStatic($method, array $arguments)
          {
              if ( ! 
      self::$container instanceof ArrayObject ) {
                  throw new 
      RuntimeException(
                      
      'Static Facade is not connected to a container'
                  
      );
              }

              if ( ! 
      self::$container->offsetExists('database') ) {
                  throw new 
      RuntimeException(
                      
      'Connected container has not Database Object'
                  
      );
              }

              if ( ! 
      self::$container->offsetGet('database') instanceof PDO ) {
                  throw new 
      RuntimeException(
                      
      'Connected container serves a incompatible database object'
                  
      );
              }

              return 
      call_user_func_array(
                  array(
                      
      self::$container->offsetGet('database'),
                      
      $method
                  
      ),
                  
      $arguments
              
      );
          }

          public static function 
      connectContainer(ArrayObject $container)
          {
              
      self::$container $container;
          }

      }

      $container = new ArrayObject();
      $container['database'] = new PDO(/** ... */);

      Database::connectContainer($container);

      Database::Prepare(/** ... */);
      Static Facade
      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

      Kommentar


      • #18
        Static Facade
        Nice, also nur für Exception Handling?
        Ausserdem sind in deiner Klasse oben noch mehr Fehler, als in der, die ich gepostet habe: z.B. ist db undefiniert.

        Kommentar


        • #19
          Jo, ich hab das im Foreneditor zusammen getippt, jetzt nicht mehr.

          Das Exception Handling im Static Facade validiert nur bei jedem Aufruf den Container, Die Magische Methode führt direkt die Methode auf dem PDO Objekt im Container aus. Das ist der "Sinn" von solchen statischen Facades.
          [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

          Kommentar


          • #20
            Also machst du nur am ArrayBezeichner aus, dass ein Objekt existieren darf? Nicht cool. Ausserdem muss man somit die Verbindungsdaten jedes Mal neu mitgeben. Und den Vorteil gegenüber Singleton habe ich immer noch nicht verstanden, ausser dass man
            PHP-Code:
            Database->getInstance()->db->prepare() 
            durch
            PHP-Code:
            Database::prepare() 
            ersetzen kann. Und das bringt mir? (ausser minimale Codereduktion)

            Kommentar


            • #21
              edit...
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #22
                Zitat von lstegelitz Beitrag anzeigen
                edit..
                verdammt... auf quote gekommen
                Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                Kommentar


                • #23
                  @Isteglitz:Was machst du eigentlich?

                  Kommentar


                  • #24
                    @lottikarotti: Vorteile sind:
                    -Nur eine Instanz
                    -Verbindungsdaten zentral verwalten

                    Kommentar


                    • #25
                      Zitat von coolio Beitrag anzeigen
                      -Nur eine Instanz
                      Das ist aber nicht unbedingt ein Vorteil. Wenn ich jetzt auf 2 Datenbanken zugreifen will, was dann?

                      Zitat von coolio Beitrag anzeigen
                      -Verbindungsdaten zentral verwalten
                      Jedes mir bekannte Framework nutzt Configs für sowas (also zentral) und gleichzeitig KEINE Singletons. Aber vieleicht ist bei denen auch einfach nur Magie im spiel
                      [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

                      Kommentar


                      • #26
                        Wenn ich jetzt auf 2 Datenbanken zugreifen will, was dann?
                        Klasse um getter/setter erweitern?
                        Jedes mir bekannte Framework nutzt Configs für sowas
                        Nice, und dann wird in jeder Datei einzeln ein Datenbankaufbau gemacht. Die Art von Codewiederverwendung kenn ich noch gar nicht.

                        Kommentar


                        • #27
                          Zitat von coolio Beitrag anzeigen
                          Klasse um getter/setter erweitern?
                          Ähm... Zeig mal nen Beispiel, verstehe nicht wie das gemeint ist.
                          [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

                          Kommentar


                          • #28
                            Ja ein doubleton machen, und dann attribwerte zuweisen.

                            Kommentar


                            • #29
                              Ein Doubleton. Na klar, warum bin ich da nicht selbst drauf gekommen.

                              Nutze am liebsten allerdings Trippleton oder Hexaton, die sind mehrwertiger, wenn du verstehst was ich meine.
                              [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

                              Kommentar


                              • #30
                                Was würdest du dann für den konnkreten Anwendungsfall vorschlagen. Würdest du auch eine static facade nutzen? Wenn ja, mache bitte deutlich, wie du die Probleme, die ich vorher bereits genannt habe, umgehen willst. Ausserdem verstehe ich deine unangebrachte Ironie nicht ganz.

                                Kommentar

                                Lädt...
                                X