Robert C. Martin による「Clean Code」で概説されているように、私はクリーンなコードを読み書きすることを好みます。彼の信条に従う場合、(API のユーザーとして) 開発者に配列の (内部) 構造を知ってもらう必要はありません。
API ユーザーは、次のように質問する場合があります。これは 1 次元のみの配列ですか? オブジェクトは多次元配列のすべてのレベルに分散していますか? すべてのオブジェクトにアクセスするには、ネストされたループ (foreach など) がいくつ必要ですか? その配列に「格納」されるオブジェクトのタイプは何ですか?
概説したように、その配列 (オブジェクトを含む) を 1 次元配列として使用したいと考えています。
西が概説したように、次を使用できます。
/**
* @return SomeObj[]
*/
そのために。
ただし、注意してください - これは標準の docblock 表記法ではありません。この表記法は、一部の IDE プロデューサーによって導入されました。
わかりました、わかりました、開発者として、「[]」が PHP の配列に関連付けられていることを知っています。しかし、通常の PHP コンテキストでは、「something[]」は何を意味するのでしょうか? 「[]」は、「何か」内に新しい要素を作成することを意味します。新しい要素はすべてである可能性があります。しかし、表現したいのは、同じタイプのオブジェクトの配列であり、正確なタイプです。ご覧のとおり、IDE プロデューサーは新しいコンテキストを導入します。あなたが学ばなければならなかった新しい文脈。他の PHP 開発者が (ドキュメントブロックを理解するために) 学ばなければならない新しいコンテキスト。スタイルが悪い(!)。
配列には 1 つの次元があるため、その「オブジェクトの配列」を「リスト」と呼びたいと思うかもしれません。「リスト」は、他のプログラミング言語では非常に特別な意味を持つことに注意してください。たとえば、「コレクション」と呼ぶ方がはるかに適切です。
覚えておいてください: OOP のすべてのオプションを有効にするプログラミング言語を使用します。配列の代わりにクラスを使用し、クラスを配列のように走査可能にします。例えば:
class orderCollection implements ArrayIterator
または、多次元配列/オブジェクト構造内の異なるレベルに内部オブジェクトを格納する場合:
class orderCollection implements RecursiveArrayIterator
このソリューションは、配列を「orderCollection」型のオブジェクトに置き換えますが、これまでのところ、IDE 内でコード補完を有効にしないでください。わかった。次のステップ:
docblocks とのインターフェースによって導入されるメソッドを実装します - 特に:
/**
* [...]
* @return Order
*/
orderCollection::current()
/**
* [...]
* @return integer E.g. database identifier of the order
*/
orderCollection::key()
/**
* [...]
* @return Order
*/
orderCollection::offsetGet()
以下に対して型ヒントを使用することを忘れないでください。
orderCollection::append(Order $order)
orderCollection::offsetSet(Order $order)
このソリューションは、多くの導入を停止します:
/** @var $key ... */
/** @var $value ... */
Zahymakaが彼女/彼の答えで確認したように、コードファイル全体(ループ内など)。API ユーザーは、コード補完のためにその docblock を導入する必要はありません。@return を 1 か所だけにすると、冗長性 (@var) が可能な限り削減されます。「docBlocks with @var」を振りかけると、コードが読みにくくなります。
最後に、完了です。達成するのは難しいように見えますか?大ハンマーでナッツを割るように見えますか?あなたはそのインターフェースときれいなコードに精通しているので、そうではありません。覚えておいてください:あなたのソースコードは一度書かれ、何度も読まれます.
IDE のコード補完がこのアプローチで機能しない場合は、より良いもの (IntelliJ IDEA、PhpStorm、Netbeans など) に切り替えるか、IDE プロデューサーの問題トラッカーに機能リクエストを提出してください。
私のトレーナーであり、素晴らしいことを教えてくれた Christian Weiss (ドイツ出身) に感謝します。PS: XING で私と彼に会いましょう。