Тъй като не знаете типа (име на клас) на върнатите обекти, преди да направите заявката, не можете да го посочите.
Въпреки това, можете да капсулирате тази логика в друг тип, който използвате като тип на връщане, който след това може да върне конкретния тип връщане:
/**
* 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;
}
}
След това можете да използвате getConcrete()
функция на всеки върнат обект, за да върне вашия специфичен тип, логиката на решението ви е свързана с връщането на базата данни.
Редактиране: Промених го във версия, която първо ще инициализира свойствата на обектите чрез unserialize (моля, тествайте дали това работи, базирано е на предположението, че говорим само за публични свойства и не знам дали PDO просто прави настройките или повече чрез отражение в режима, който използвате) и след това извиква функцията на конструктора. Конструкторът трябва да е публичен (и трябва да съществува), за да работи.
Технически е възможно това да се направи достъпно и за частни и защитени членове, но това се нуждае от истинско обмисляне и също така се нуждае от синтактичен анализ на сериализираните данни. Този клас само преименува името на класа, но не и в частните свойства.
Това обаче е само един от начините да го направите. Вероятно се нуждаете само от ->isChild()
или ->isAdult()
функция на вашето Person
клас.