Как я могу вернуть несколько значений из функции, которая будет поддерживать автодополнение IDE?

Представьте, что у вас есть функция, которая выбирает данные из таблицы базы данных, используя что-то вроде этого запроса:

select count(id), sum(amount) from payments group by amount;

Затем он передает результаты в другую функцию, которая просматривает результаты и возвращает массив, причем каждый элемент в массиве ссылается на одну строку из результата. Например:

private function packageResults(array $results)
{
    $ret = [];
    foreach ($results as $result) {
        // add $result['sum'] and $result['count'] to something, then add it to the $ret array
    }

    return $ret;
}

Теперь, если в foreach цикл, я добавляю результаты в ассоциативный массив или StdClass а затем добавить его в $ret, вам придется читать мой код внутри foreach узнать структуру (т.е. свойства, установленные на StdClassили ключи, установленные в ассоциативном массиве). Я имею в виду, что, поскольку оба эти типа данных имеют произвольную форму, то есть их ключи / свойства нигде не документированы, человек, использующий мой код, должен сначала вывести выходные данные, чтобы узнать, что возвращает эта функция.

Что я могу использовать, чтобы сообщить пользователю (и его IDE), какова структура данных, которые я возвращаю, чтобы им не пришлось копаться в моем коде, чтобы найти его? Объекты передачи данных сделаны для этого материала? Я имею в виду объекты передачи данных, потому что они являются классами со своими собственными свойствами, и это можно использовать, чтобы узнать, что именно возвращает моя функция. Однако я не уверен, что это правильный подход с точки зрения разработки программного обеспечения.

1 ответ

Решение

Как правило, чтобы подсказать другим (тоже IDE) о конструкциях, которые возвращает ваша функция, используйте @var array $results phpdoc аннотация, например

/** @var BlahBlah $someVar */
$someVar = new BlahBlah();
$someVar->... (IDE will show you available things with context help now).

Чтобы показать тип объектов в массиве, который вы заполняете с помощью foreach, выполните:

/** @var BlahBlah[] $someArray */
$someArray = array();

$someArray[1] = new BlahBlah(); // (IDE should help you with context help if you use it later

Вы также можете позвонить туда, где вам это нужно:

$x = 0;
foreach ($someArray as $value) {
    /** @var BlahBlah $value */
    $x += $value->getSomeValue(); // (IDE will help you with context help).
}

Что касается вашего случая, если вы знаете, что это будет массив, а пользователю вашей функции понадобятся конкретные значения, вы МОЖЕТЕ и ДОЛЖНЫ использовать для него новый класс (DTO, как вам хочется) (я никогда не был фанатом ассоциативных массивы в любом случае). Если вы правильно заполните поля объекта, то сможете подсказать пользователю, какой тип вы возвращаете (и эти поля тоже могут быть аннотированы, как, например, $price будет stdClass, $ что-то будет SomethingElse и т. Д.), И он выиграл не нужно заглядывать внутрь своей функции, поскольку то, что вы ему возвращаете, будет работать как своего рода интерфейс для него.

Имейте в виду, что это не строго DTO шаблон. DTOs используются для дорогой связи между веб-сервисами. Я использую этот термин здесь только как упрощение сортов. Если вы хотите узнать больше о DTO, вы должны отсканировать Google для получения информации об этом (куда бы вы ни пошли).

Здесь вам нужен объект, являющийся интерфейсом для сортировки данных, который будет агрегировать значения, которые вам нужно получить из базы данных, работать с ними и передавать во внешний интерфейс, так что более или менее это POPO, что вам нужно (Plain Old PHP Object, эквивалент Java POJO).

Другие вопросы по тегам