Array Shapes記法

Array Shapes記法

11月 28, 2021

PhpStorm 2021.2 メジャーアップデートによって追加された新機能の一つ”Array shapes”

この機能によってPHPDocの表現がより柔軟になるのではという予感がしています。

PhpStorm 2021.2 メジャーアップデート


当アップデートに関するJetBrains公式の記事はコチラから。

追加された様々な新機能

今回のアップデートにより追加された主な機能は以下

  • @templateアノテーションによるジェネリクス対応
  • PHP8.1で追加予定となる列挙型(Enums)の先行対応
  • 配列構造の新たな定義 Array shapesの追加
  • リファクタ機能 Extract Methodの改善
  • etc…

個人的に注目した機能

2021.2 アップデートにより様々な機能の追加・改善が行われました。
自身の日々の開発業務に影響をもたらす機能としてはArray Shapesが挙げられます。

現状で触れているPHPは主に7系のため、直近で列挙型を扱う予定はありません。
また、ジェネリクスを用いた実装も行っていません。
Extract Methodによるリファクタ、つまり重複コード等に対するリファクタも正直優先度は低い状態です。

ここからは最も親近感のあるArray Shapesに話題を絞ります。

PHPDocアノテーション “Array Shapes”


見出しの通り、Array ShapesとはPHPDocのアノテーションの一つです。

結論から言うと、Array Shapesを活用することで配列(主に連想配列)におけるPHPDocによる表現がより柔軟になります。

Array Shapesの概要

オブジェクト上の配列(連想配列と言い替えることもできます)に対して、その構造をPHPDocのアノテーションを利用して定義することが可能になりました。

array{key: type, key: type, …}

/**
 * @return array{id: int, name: string, createdAt: \DateTimeImmutable}
 */
function hoge(): array
{
    ...
}

意味を成さない配列定義からの脱却

配列に対するこれまでのPHPDocによる定義はあまり意味を持たないという所感があります。

要素が単一の型で構成された添字配列は@param string[]@return FugaClass[]等の表現によってある程度の可読性は高められます。

しかし、連想配列はもちろん、複数の型から構成される配列に対するPHPDocとしての表現は
@param arrayに留まるかと思います。
これではmixedと大差なく、PHPDoc上では配列構造がブラックボックスと化します。

PHPの配列というものが変数同様、あらゆる値をとりうることが可能なのも上記の理由の一つです。

連想配列に対する補完機能はこれまでdeep-assoc-completion等のプラグインを導入することで対応可能でしたが、Array Shapesにより定義された配列はプラグインの有無に関わらず補完が可能となります。

サポート対象は単一行の定義のみ

Array Shapesの登場により、配列構造に対するPHPDoc上の表現が改善されましたが、現状では単一行での定義のみ対応しています。

つまり、より複雑な配列構造に対してArray Shapesを適用するためにPHPDoc上で複数行の定義を行うといったことは現状不可能です。

公式でも述べられていますが、より大きな構造を持つ場合は各要素に対してオブジェクトやクラスによる切り出しが可能かどうかを検討することも重要です。