DatabaseObject

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • Die DatabaseObject-Klasse wird verwendet, um aus einem gedachten Datenbank Objekt in ein php Objekt zu generieren.

    Erklärung


    Immer dann, wenn man in der Datenbank eine neue Tabelle für ein eigenständiges Objekt angelegt wird, benutzt man die DatabaseObject, um die angefragten Daten zu verarbeiten. Stellen wir uns mal kurz vor, wir möchten ein Shop entwickeln, so würde es sich u.a. anbieten, für die dort angebotenen Produkte eine Vererbung der DatabaseObject Klasse zu benutzen. So hätten wir stets eine Datei, die sich um ein einzelnes Produkt kümmern kann.

    Die DatabaseObject Klasse auf GitHub


    Zu finden ist die DatabaseObject Klasse auf GitHub unter diesem Link: github.com/WoltLab/WCF/blob/ma…/DatabaseObject.class.php

    Aufbau der Datei


    Der Rohaufbau unserer Datei wäre folgender

    PHP Source Code: Product.class.php

    1. <?php
    2. namespace shop\data\product;
    3. use wcf\data\DatabaseObject;
    4. /**
    5. * Represents a product.
    6. * Hier würde sich als Kommentar noch anbieten, ein @author, ein @licence und ein @package anzubeieten
    7. */
    8. class Product extends DatabaseObject {
    9. }



    In Zeile 2 legen wir fest, wo der Autoloader des WSC unsere Product.class.php auffinden kann
    In Zeile 3 "binden" wir die DatabaseObject Klasse ein.
    In Zeile 5 bis 8 geben wir den Kommentar für die Klasse an. Was macht die Klasse, wer hat sie erstellt, unter welcher Lizenz steht sie und zu welchem Plugin gehört sie? All dies sollte mindestens an dieser Stelle beantwortet werden.
    In Zeile 9 geben wir den Namen der Klasse an, der gleichzeitig mit dem Namen der Datei übereinstimmen muss. In diesem Fall heißt die Datei "Product.class.php". Gleichzeitig erben wir alle Eigenschaften der DatabaseObject Klasse.

    An dieser Stelle kann unsere Ableitung der DatabaseObject Klasse noch nichts, denn diese weiß nicht, in welcher Tabelle der Datenbank sie ihre Ergebnisse suchen müsste. Aus diesem Grund geben wir den Namen der Datenbank durch die Klassenvariabel $databaseTableName an. Den Primary Key und den dazugehörigen Autoincrement Wert der Datenbank geben wir durch die Klassen Variabel $databaseTableIndexName an.

    PHP Source Code: Product.class.php

    1. /**
    2. * @see wcf\data\DatabaseObject::$databaseTableName
    3. */
    4. protected static $databaseTableName = 'product'; // Unsere Datenbanktabelle heißt in unserem Beispiel shop1_product
    5. /**
    6. * @see wcf\data\DatabaseObject::$databaseTableIndexName
    7. */
    8. protected static $databaseTableIndexName = 'productID';// Der Primary Key der Tabelle liegt auf dem Feld productID
    Nach der Initialisierung der Variablen $product kann nun auf jedes Datenbankfeld der Tabelle wie in einem Objekt zugegriffen werden. Ist ein Feld nicht definiert, gibt das WSC null zurück.
    Um also eine Tabelle auszulesen, muss man nur noch die Datei durch use einbinden und die Klasse neu initialisieren und schon können wir uns sämtliche SELECT Abfragen sparen. Hinzu kommt, dass wir eigenständige Funktionen definieren können und die durch die DatabaseObject bereits vorgegebenen Funktionen verwenden können.
    Die wohl wichtigste Funktion ist getObjectID(), diese gibt die aktuelle ID des Objektes wieder, die durch $databaseTableIndexName definiert wurde. Jedoch gibt es keine wirklich interessanten weiteren Funktionen, die man in der alltäglichen Arbeit benötigt. Es sei also nur der Vollständigkeitshalber gesagt, dass man sich durch die Funktion getDatabaseTableName() den Namen der Datenbanktabelle, durch getDatabaseTableAlias() den Alias der Datenbank und durch getDatabaseTableIndexName() den Feldnamen auf den der Autiincrement-Wert liegt zurückgeben lassen kann.

    Aufruf


    An dieser Stelle hätte unsere Ableitung der DatabaseObject Klasse den kleinstmöglichen Nenner, um lauffähig zu sein. Wichtig zu wissen ist, das beim Aufruf einer Ableitung der DatabaseObject Klasse, diese durch die Übergabe von drei Parametern stattfinden kann

    PHP Source Code

    1. $product = new Product($productID); // Aufruf durch die ID des Objektes
    2. $product = new Product(null, $row); // Aufruf durch das Ergebnisses einer bereits erfolgten Datenbank Abfrage
    3. $product = new Product(null, null, $object); // Aufruf durch ein bereits initialisiertes Objekt

    Komplettes Beispiel


    PHP Source Code: Product.class.php

    1. <?php
    2. namespace shop\data\product;
    3. use wcf\data\DatabaseObject;
    4. /**
    5. * Represents a product.
    6. * @author Marcel Beckers
    7. * @licence LGPL
    8. * @package de.yourecom.example
    9. */
    10. class Product extends DatabaseObject {
    11. /**
    12. * @see wcf\data\DatabaseObject::$databaseTableName
    13. */
    14. protected static $databaseTableName = 'product'; // Unsere Datenbanktabelle heißt in unserem Beispiel shop1_product
    15. /**
    16. * @see wcf\data\DatabaseObject::$databaseTableIndexName
    17. */
    18. protected static $databaseTableIndexName = 'productID';// Der Primary Key der Tabelle liegt auf dem Feld productID
    19. }
    Display All


    Ihr habt Fragen oder Anregungen? Lob oder Kritik? Lasst es mich doch durch einen Kommentar von euch wissen!

    11,466 times viewed

Comments 5

  • ruhrpottbobo -

    Wo wird diese Datei abgespeichert, wenn es keine eigene Seite ist, sondern nur eine im Content gespeicherte Dashboardbox ?

  • ruhrpottbobo -

    Frage zur Zeile 9 den Namen der Klasse/Dateinamen, was passiert wenn der Name schonmal vorgekommen ist oder spielt das keine Rolle

    • Marcel Beckers -

      Hast du dich schonmal mit Namespaces in php beschäftigt? Einfaches einlesen reicht. Ist nicht schwer das Thema.

      Um aber deine Frage zu beantworten: Solange die Datei in einem anderen Ordner ist, sollte es egal sein. Um dir aber einen Tipp zu geben, würde ich diese aber definitiv anders benennen. Beugt spätere Verwirrung vor ;)

    • ruhrpottbobo -

      Danke werde ich umgehend tun! Andererseits, weiss ich aber nicht auf welche Namensgebungen andere Developer kommen. Gegen alles kann man ja nicht vorbeugen.

    • Marcel Beckers -

      Das nicht. Der Name der Klasse sollte nur selbsterklärend sein. Das ist das Wichtigste.