Поскольку вы не знаете тип (имя класса) возвращаемых объектов до выполнения запроса, вы не можете его указать.
Однако вы можете инкапсулировать эту логику в другой тип, который вы используете в качестве возвращаемого типакоторый затем может вернуть определенный тип возвращаемого значения:
/**
* 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
.