sql >> Database >  >> RDS >> Mysql

PDO::FETCH_CLASS met meerdere klassen

Aangezien u het type (klassenaam) van de geretourneerde objecten niet weet voordat u de query uitvoert, kunt u deze niet specificeren.

U kunt die logica echter inkapselen in een ander type dat u als retourtype gebruikt, dat vervolgens het specifieke retourtype kan retourneren:

/**
 * 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;
    }
}

U kunt dan de getConcrete() . gebruiken functie op elk geretourneerd object om uw specifieke type te retourneren, uw beslissingslogica gebonden aan de databaseretour.

Bewerken: Ik heb het veranderd in een versie die eerst de objecteigenschappen initialiseert via unserialize (test als dit werkt, het is gebaseerd op de veronderstelling dat we het alleen over openbare eigenschappen hebben en ik weet niet of PDO alleen de setters of meer doet via reflectie in de modus die u gebruikt) en roept vervolgens de constructorfunctie aan. De constructor moet openbaar zijn (en hij moet bestaan) zodat dit werkt.

Het is technisch mogelijk om dit ook beschikbaar te maken voor particuliere en beschermde leden, maar dit vereist echte reflectie en het moet ook ontleden van de geserialiseerde gegevens. Deze klasse hernoemt alleen de klassenaam, maar niet binnen privé-eigenschappen.

Dit is echter slechts één manier om dit te doen. Je hebt waarschijnlijk alleen een ->isChild() . nodig of ->isAdult() functie op uw Person klasse.



  1. Oracle:hoe kom ik erachter of er een transactie in behandeling is?

  2. SQL SELECTEER MAX

  3. Load Balancers vergelijken voor PostgreSQL

  4. Foutcode 1005, SQL-status HY000:Kan geen tabel maken errno:150