🍣

PHPStan array shapes記法で空配列を表現できることに気づいた

2023/11/14に公開

はじめに

PHPStanのエラーを対応している中で空配列をどのように書けばいいか気づいたのでメモを残しておきます。

気づいたこと

すごい極端なサンプル

/**
 * @return array{test: int}
 */
function test(int $num): array
{
    if ($num === 0) {
        return [];
    }
    return ['test' => $num];
}

上記サンプルのようなコードをPlaygroundで確認で確認すると
Function test() should return array{test: int} but returns array{}.ってエラーが出ます。

解決方法に悩んでいたら...気づきました!

PHPStanのエラー内容にarray{}って書かれていましたね!!

下記のようにPHPDocにarray{}を追加して再度Playgroundで確認するとエラーが出ないことが確認できました!!

/**
 * @return array{test: int}|array{}
 */
function test(int $num): array
{
    if ($num === 0) {
        return [];
    }
    return ['test' => $num];
}

以上、気づきたことでした。

追記

X(旧Twitter)にて、次のように書けることを教えてもらいました。

https://twitter.com/takeokunn/status/1724220949283901590

/**
 * @return array{test?: int}
 */
function test(int $num): array
{
    if ($num === 0) {
        return [];
    }
    return ['test' => $num];
}

こちらでもエラーは出ないですね。
https://phpstan.org/r/d0ebfc8a-0cdb-4758-8b14-c6d3ff27065a

Discussion