Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PDO::FETCH_CLASS mit mehreren Klassen

Da Sie den Typ (Klassenname) der zurückgegebenen Objekte nicht kennen, bevor Sie die Abfrage durchführen, können Sie ihn nicht angeben.

Sie könnten diese Logik jedoch in einen anderen Typ kapseln, den Sie als Rückgabetyp verwenden, der dann den spezifischen Rückgabetyp zurückgeben kann:

/**
 * Should not have any private, public or protected members in it's definition.
 * 
 * Does only work for public properties.
 */
class ReturnObject {
    public function getConcrete()
    {
        /* decide here which class */
       $classname = 'Child'; // or 'Adult'

       return $this->selfAs($classname);
    }

    private function selfAs($classname)
    {
        $l = strlen(__CLASS__);
        $s = sprintf('O:%d:"%s"', strlen($classname), $classname).substr(serialize($this), 5+strlen($l)+$l);
        $instance = unserialize($s);
        $instance->__construct();
        return $instance;
    }
}

Sie können dann getConcrete() verwenden Funktion für jedes zurückgegebene Objekt, um Ihren spezifischen Typ zurückzugeben, Ihre Entscheidungslogik, die an die Datenbankrückgabe gebunden ist.

Bearbeiten: Ich habe es in eine Version geändert, die zuerst die Objekteigenschaften über Deserialize initialisiert (bitte testen Sie, ob dies funktioniert, es basiert auf der Annahme, dass wir nur über öffentliche Eigenschaften sprechen und ich nicht weiß, ob PDO nur die Setter oder mehr macht über Reflektion im verwendeten Modus) und ruft dann die Konstruktorfunktion auf. Der Konstruktor muss öffentlich sein (und er muss existieren), damit dies funktioniert.

Es ist technisch möglich, dies auch für private und geschützte Mitglieder verfügbar zu machen, aber dies erfordert eine echte Reflexion und es erfordert auch eine Analyse der serialisierten Daten. Diese Klasse benennt nur den Klassennamen um, aber nicht innerhalb privater Eigenschaften.

Dies ist jedoch nur eine Möglichkeit, dies zu tun. Sie brauchen wahrscheinlich nur ein ->isChild() oder ->isAdult() Funktion auf Ihrer Person Klasse.