如何从支持IDE自动完成的函数返回多个值?

时间:2014-07-07 06:32:53

标签: php data-transfer-objects

想象一下,你有一个从数据库表中选择数据的函数,使用类似这样的查询:

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找出结构(IE在StdClass上设置的属性,或在关联数组上设置的键)。我的意思是,由于这两种数据类型都是自由格式的,这意味着它们不会在任何地方记录其键/属性,因此首先使用我的代码的人必须转储输出才能知道此函数返回的内容。 / p>

我可以用什么来告诉用户(及其IDE)我返回的数据结构是什么,这样他们就不必挖掘我的代码来找到它?是否为这些东西制作了数据传输对象?我正在考虑数据传输对象,因为它们是具有自己属性的类,这可以用来知道我的函数究竟返回什么。但是,从软件设计的角度来看,我不确定这是否是正确的方法。

1 个答案:

答案 0 :(得分: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,$ something将是SomethingElse等)并且他赢了我需要查看你的功能,因为你回来的东西将作为他的界面。

请记住,它不是严格的DTO模式。 DTO用于f.e之间的昂贵通信。网页服务。我在这里使用这个术语只是为了简化各种类型。如果您想了解有关DTO的更多信息,您应该扫描谷歌以获取有关它的信息(无论您去哪里都有很多)。

这里需要的是一个对象,它是各种数据的接口,它将聚合您需要从数据库获取的值,操作并传递给前端,因此或多或少它是您需要的POPO(Plain旧的PHP对象,相当于Java的POJO。)