Предположим, у меня есть следующая функция PHP:
/**
* @param string $className
* @param array $parameters
* @return mixed
*/
function getFirstObject($className, $parameters) {
// This uses a Doctrine DQl builder, but it could easily replaced
// by something else. The point is, that this function can return
// instances of many different classes, that do not necessarily
// have common signatures.
$builder = createQueryBuilder()
->select('obj')
->from($className, 'obj');
addParamClausesToBuilder($builder, $parameters, 'obj');
$objects = $builder
->getQuery()
->getResult();
return empty($objects) ? null : array_pop($objects);
}
По сути, функция всегда возвращает либо экземпляр класса, указанного параметром $className
, либо null
, если что-то пошло не так. Единственная загвоздка в том, что я не знаю полного списка классов, которые может вернуть эта функция. (во время компиляции)
Можно ли получить подсказку типа для возвращаемого типа функции такого типа?
В Java я бы просто использовал дженерики, чтобы указать тип возвращаемого значения:
static <T> T getOneObject(Class<? extends T> clazz, ParameterStorage parameters) {
...
}
Я знаю о подсказке ручного типа, например
/** @var Foo $foo */
$foo = getOneObject('Foo', $params);
но я хотел бы иметь решение, которое не требует этой шаблонной строки.
Чтобы уточнить: я пытаюсь написать оболочку вокруг Doctrine, чтобы я мог легко получить нужные мне объекты модели, инкапсулируя все специфическое использование системы ORM. Я использую PhpStorm.
** отредактированная функция, чтобы отразить мое предполагаемое использование. Изначально я хотел, чтобы он был чистым от любого конкретного варианта использования, чтобы не раздувать вопрос. Также обратите внимание, что фактическая оболочка более сложна, поскольку я также включаю неявные объектные отношения для конкретной модели и соединения и т. Д.
that I do not know the full list of classes this function can return
противaware of the manual type hinting
, если вы этого не сделаете сейчас, во-первых, как вы это сделаете, единственное решение: все классы должны реализовать один и тот жеinterface
, и этот интерфейс затем используется для возврата типаin PHP7 only
, напримерfunctionA : interfacX (){}
- person JustOnUnderMillions   schedule 16.08.2016/** @var Foo $foo */
позволяет php-инструментам, таким как PHPStrom, предоставлять вам правильный список методов/реквизитов возвращаемого класса, если указан тип 1-1. - person JustOnUnderMillions   schedule 16.08.2016getObjects(...)
может возвращать любой экземпляр классов, которые добавляются и удаляются во время выполнения. Однако, когда я использую функцию, я точно знаю, какой конкретный класс мне нужен, потому что я указал его в аргументах функции. По сути, я должен сказать две вещи: (1) Дайте мне собаку. и (2) Эта вещь, которую я только что получил, — это собака... Номер 2 кажется необходимым в этом случае использования, но это совершенно избыточное утверждение. - person LostMekkaSoft   schedule 17.08.2016PHP
неJAVA
. ;-)) Так что ООП в PHP немного отличается, намного проще, чем в Java :-) Надеюсь, вы найдете способ, и вы не закончите багги-функцией :)) - person JustOnUnderMillions   schedule 17.08.2016