0

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

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将其添加到关联数组)。我的意思是,由于这两种数据类型都是自由格式的,这意味着它们的键/属性在任何地方都没有记录,使用我的代码的人首先必须转储输出才能知道这个函数返回什么。$retforeachStdClass

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

4

1 回答 1

1

通常,要提示其他人(IDE)关于构造函数返回的信息,请使用@var array $resultsphpdoc 注释,fe

/** @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 用于 fe Web 服务之间的昂贵通信。我在这里使用这个术语只是为了简化。如果您想了解更多关于 DTO 的信息,您应该扫描 google 以获取有关它的信息(无论您走到哪里都有大量的信息)。

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

于 2014-07-07T08:53:12.243 回答