Eftersom du inte känner till typen (klassnamn) för de returnerade objekten innan du gör frågan, kan du inte ange den.
Du kan dock kapsla in den logiken i en annan typ som du använder som returtyp som sedan kan returnera den specifika returtypen:
/**
* 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 sedan använda getConcrete()
funktion på varje returnerat objekt för att returnera din specifika typ, din beslutslogik är bunden till databasens retur.
Redigera: Jag ändrade den till en version som först kommer att initiera objektens egenskaper via unserialize (testa om detta fungerar, det är baserat på antagandet att vi bara pratar om publika egenskaper och jag vet inte om PDO bara gör sättare eller mer via reflektion i det läge du använder) och anropar sedan konstruktorfunktionen. Konstruktören måste vara offentlig (och den måste finnas) så att detta fungerar.
Det är tekniskt möjligt att göra detta tillgängligt för privata och skyddade medlemmar också, men detta kräver verklig reflektion och det behöver också analyseras av serialiserade data. Den här klassen byter bara namn på klassnamnet, men inte i privata egenskaper.
Detta är dock bara ett sätt att göra det. Du behöver förmodligen bara en ->isChild()
eller ->isAdult()
funktion på din Person
klass.