sql >> Database teknologi >  >> RDS >> Mysql

PDO::FETCH_CLASS med flere klasser

Da du ikke kender typen (klassenavn) af de returnerede objekter, før du udfører forespørgslen, kan du ikke angive det.

Du kan dog indkapsle denne logik i en anden type, du bruger som returtype, som derefter kan returnere den specifikke returtype:

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

Du kan derefter bruge getConcrete() funktion på hvert returneret objekt for at returnere din specifikke type, din beslutningslogik er bundet til databasereturn.

Rediger: Jeg ændrede det til en version, der først vil initialisere objektegenskaberne via unserialize (test venligst om dette virker, det er baseret på den antagelse, at vi kun taler om offentlige egenskaber, og jeg ved ikke, om PDO kun gør sætterne eller mere via refleksion i den tilstand, du bruger) og kalder derefter konstruktørfunktionen. Konstruktøren skal være offentlig (og den skal eksistere), så dette virker.

Det er teknisk muligt også at gøre dette tilgængeligt for private og beskyttede medlemmer, men dette kræver reel refleksion, og det kræver også parsing af de serialiserede data. Denne klasse omdøber kun klassenavnet, men ikke i private ejendomme.

Dette er dog kun én måde at gøre det på. Du behøver sandsynligvis kun en ->isChild() eller ->isAdult() funktion på din Person klasse.



  1. Vedhæft en database i SQLite

  2. 4 tabelformede outputtilstande i SQLite

  3. Sådan aktiverer du understøttelse af fremmed nøgle i SQLite

  4. MariaDB UNION Operatør forklaret