• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Was gehört in eine Klasse?

achtelpetit

Neues Mitglied
Guten Tag zusammen,
ich bitte euch um einen Ratschlag bezüglich des Aufbaus einer Klasse:
gegenwärtig erzeuge ich meine DB als ein PDO-Objekt mit Hilfe einer Funktion, diese Funktion wird per "required" in das jeweilige Skript eingebunden.
Wenn ich nun eine Klasse erstelle, in der diese DB gebraucht wird, wie gehe ich damit um? Ist es gut, das DB-Objekt genau wie in einem Script als "required" einzubinden?
Gibt es andere Wege, aus der Klasse auf die DB zuzugreifen?
 
Das ist ja mal 'ne gute Idee. Ich binde also das PDO-Objekt in eine Klasse und das wiederum in eine Klasse.
kann ich das Spiel immer weiter treiben? Ist das (unter anderem) der Sinn der objektorientierten Programmierung?
 
Hallo,

ich gehe davon aus, dass das PDO-Objekt in einer Variable gesichert ist. Innerhalb von Klassenmethoden und Funktionen lassen sich solche Variablen als global definieren, um diese dort zu benutzen.

Siehe PHP: Geltungsbereich von Variablen - Manual.

Der Sinn von OOP ist es - nach meinem Verständnis -, Variablen und Funktionen, die zusammen- und von einander abhängen, in einer Klasse zu vereinen, um sie als Gesamtes im restlichen Programm einfacher/übersichtlicher zu verwenden. Im Zuge dieser objektorientieren Abstraktion gibt es natürlich auch Objekte, die einem anderen Objekt angehören.
Ob ein PDO-Objekt einer anderen Klasse angehören sollte, lässt sich pauschal nicht sagen. Ich würde meinen, das kommt darauf an, für was diese Klasse sonst noch zuständig ist.

Gruß
 
@DB-Adapter:

Eine entsprechende Klasse, die intern PDO nutzt, könnte etwa so aufgebaut sein:

PHP:
class MyDbAdapter
{
    protected $pdo;

    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    public function doSomething()
    {

    }
}

Was den Einsatz angeht:

PHP:
class SomeClassThatNeedsTheDatabase
{
    protected $db;

    public function __construct(MyDbAdapter $db)
    {
        $this->db = $db;
    }

    public function doDatabaseStuff()
    {
        $this->db->doSomething();
    }
}




$adapter = new MyDbAdapter(new PDO(...));

$someClass = new SomeClassThatNeedsTheDatabase($adapter);

Zentral eine Instanz des Adapters generieren und diese an alle Klasseninstanzen übergeben, die auf die Datenbank zugreifen möchten (Dependency Injection).



@OOP:

Ja, die Erklärung ist ganz gut. Das hier ist vielleicht etwas zu simpel, aber hey, jetzt habe ich es halt getippt:

Noch ein Beispiel für einen wesentlichen grundlegenden Aspekt von Objektorientierung:

Es soll eine Person im Programm abgebildet werden. Eine Person hat meinetwegen als relevante Eigenschaften einen Vornamen, einen Nachnamen und ein Alter.

Der simpelste Ansatz wäre:

PHP:
$vorname  = 'Mark';
$nachmane = 'van Bommel';
$alter    = 34;

Der stößt allerdings schon an seine Grenzen, wenn mehrere Personen gleichzeitig gespeichert werden sollen. Besser:

PHP:
$person1_vorname  = 'Mark';
$person1_nachmane = 'van Bommel';
$person1_alter    = 34;

$person2_vorname  = 'Lucas';
$person2_nachmane = 'Barrios';
$person2_alter    = 26;

Immer noch nicht so richtig komfortabel. Angenommen, die Daten einer Person sollten in eine Textdatei abgespeichert werden. Dazu könnte die folgende Funktion dienen:

PHP:
function person_speichern($vorname, $nachname, $alter)
{
    // ...
}

Das wäre sehr umständlich aufzurufen und sobald der Person ein neues Feld (meinetwegen die Adresse) hinzugefügt werden sollte, müssten die Funktionssignatur und sämtliche Aufrufe verändert werden.

PHP:
function person_speichern($vorname, $nachname, $alter, $adresse) { ... }

person_speichern($person1_vorname, $person1_nachname, $person1_alter, $person1_adresse);

Es wäre also praktisch, die Daten einer Person in einer Variable zusammenzufassen und nur noch diese zu übergeben.

PHP:
$person1 = array(
    'vorname'  => 'Mark',
    'nachname' => 'van Bommel',
    'alter'    => 34,
    // ...
);

function person_speichern($person) { ... }

Jetzt ist nur noch blöd, dass das Array auch solche Werte enthalten könnte:

PHP:
$person1 = array(
    // Vorname fehlt
    'nachname' => null,
    'alter'    => -392,
    // ...
);

Wäre gut, dem Array sagen zu können, dass gewisse Werte oder Kombinationen von Werten keinen Sinn ergeben. Es wäre gut, sicherstellen zu können, dass eine Art „interner Zustand“ der Person immer gültig ist. Das ist beispielsweise mit Objekten mit Gettern/Settern möglich:

PHP:
class Person
{
    protected $vorname;
    protected $nachname;
    protected $alter;

    public function __construct($vorname, $nachname, $alter)
    {
        $this->setVorname($vorname);
        $this->setNachname($nachname);
        $this->setAlter($alter);
    }

    public function getVorname()
    {
        return $this->vorname;
    }

    public function setVorname($vorname)
    {
        if (!is_string($vorname) || trim($vorname) === '') {
            throw new Exception('Vorname muss ein String und nicht leer sein');
        }

        $this->vorname = $vorname;
    }

    public function getNachname()
    {
        return $this->nachname;
    }

    public function setNachname($nachname)
    {
        if (!is_string($nachname) || trim($nachname) === '') {
            throw new Exception('Nachname muss ein String und nicht leer sein');
        }

        $this->nachname = $nachname;
    }

    public function getAlter()
    {
        return $this->alter;
    }

    public function setAlter($alter)
    {
        if (!is_int($alter) || $alter < 0) {
            throw new Exception('Alter muss eine Ganzzahl >= 0 sein');
        }

        $this->alter = $alter;
    }
}

Diese Person beschwert sich über etwaige unsinnige Eingaben und sorgt so dafür, dass ihr Zustand immer – nach gewissen Maßstäben – korrekt ist:

PHP:
$lucas = new Person('Lucas', 'Barrios', -238);

// Fatal error: Uncaught exception 'Exception'
// with message 'Alter muss eine Ganzzahl >= 0 sein'

Verarbeitender Code – etwa die Speicherfunktion – kann so davon ausgehen, korrekte Daten übergeben zu bekommen.​
 
Warum ist der Adapter nicht gleich eine Klasse speziell für PDO_Mysql, damit wir für Mysqli, PDO_Sqlite usw. ein einheitliches Interface haben?

PHP:
class My_Db_Adapter_Pdo_Mysql extends My_Db_Adapter_Pdo_AbstractAdapter
{
    protected $pdo;

    const KEY_QUOTE = '´';

    public function __construct($hostname, $port, $username, $password, $database)
    {
        $dsn = $this->generateDsn($hostname, $port, $username);
        $this->pdo = new PDO($dsn, $username, $password);
    }

    public function find ($table, $field, $id) {
        $this->pdo->query('SELECT * FROM '.$this->quoteIdentifer($table).'  WHERE '.$this->quoteIdentifier($field).'='.$this->pdo->quote($id, PDO::PARAM_INT));
    }
}

Quoteidentifer quotet automatisch die Keywords, kommt aus der übergeordneten Klasse (welche die Konstante verwendet) und generateDsn() ebenfalls.

Wer sowas nicht selbst entwickeln will, sollte sich Zend_Db ansehen.
 
Zuletzt bearbeitet:
Danke für Eure Antworten. Mermshaus hat sich ja richtig viel Mühe gegeben, dafür ein extra Danke schön; ich werd 'ne Weile brauchen, das zu verinnerlichen.
Bitte zunächst noch eine Antwort: werden die Objekte, die ich in einem Script erzeuge, automatisch zerstört, nachdem das Script abgearbeitet wurde? Oder mülle ich allmählich der Arbeitsspeicher zu, wenn ich nicht explizit jedes Objekt mit "unset" wegputze?
 
Zurück
Oben