0

次のクエリのようなものを使用して、データベース テーブルからデータを選択する関数があるとします。

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

次に、結果を別の関数に渡します。この関数は、結果をループして配列を返します。配列内の各要素は、結果の 1 つの行を参照します。例えば:

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) に、返されるデータの構造を伝えるために何を使用すればよいでしょうか? データ転送オブジェクトはこのようなもののために作られていますか? データ転送オブジェクトは独自のプロパティを持つクラスであるため、これを使用して関数が返すものを正確に知ることができます。ただし、これがソフトウェア設計の観点から正しいアプローチであるかどうかはわかりません。

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 に答える