Ponieważ nie znasz typu (nazwy klasy) zwracanych obiektów przed wykonaniem zapytania, nie możesz go określić.
Można jednak zawrzeć tę logikę w innym typie używanym jako typ zwracany, który może następnie zwrócić określony typ zwracany:
/**
* 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;
}
}
Następnie możesz użyć getConcrete()
funkcji na każdym zwróconym obiekcie, aby zwrócić twój określony typ, twoją logikę decyzji powiązaną ze zwrotem bazy danych.
Edytuj: Zmieniłem go na wersję, która najpierw zainicjuje właściwości obiektów poprzez unserialize (proszę przetestować, czy to działa, opiera się na założeniu, że mówimy tylko o właściwościach publicznych i nie wiem, czy PDO tylko robi settery, czy więcej poprzez odbicie w trybie, którego używasz), a następnie wywołuje funkcję konstruktora. Konstruktor musi być publiczny (i musi istnieć), aby to działało.
Jest to technicznie możliwe, aby udostępnić to również członkom prywatnym i chronionym, jednak wymaga to rzeczywistego odzwierciedlenia, a także wymaga analizy danych serializowanych. Ta klasa zmienia tylko nazwę klasy, ale nie wewnątrz prywatnych właściwości.
Jest to jednak tylko jeden sposób na zrobienie tego. Prawdopodobnie potrzebujesz tylko ->isChild()
lub ->isAdult()
funkcja na Twojej Person
klasa.