ことれいのもり

PHP Intelephense 変数を宣言しているのに赤い波線が出てしまう問題の解決法

はじめに

VSCodeを使ってPHPでプログラミングをしているとき、変数を宣言しているにもかかわらず赤い波線が出ることがありました。

この問題を対処したので残しておきます。

前提

バージョン

  • PHP 8.0
  • VSCode
    • 拡張機能:PHP Intelephenseを使用

問題が起こった状況

VSCode の拡張機能である、PHP Intelephense を使用している状況下でプログラミングを行なっていました。

以下のコードは該当部分を抜き出した物です。

関数updateArticlesで処理を書いている最中、

$existingImageCount という変数を宣言し、foreach文の中で使用しました。


 /**
 * 編集した記事を更新する
 *
 * @return void
 */
private function updateArticle()
{
    // ...
    // 省略
    // ...

    // 既存画像の枚数を取得
    // 更新前の枚数に続いて連番でリネームするため、最後に追加された画像の末尾番号を取得
    $existingImageCount = $this->articleModel->getUploadedImageNextNumber($id);
    if ($existingImageCount === -1) {
      echo "画像の番号のリネームに失敗しました";
      return;
    }

    // 記事画像のリネーム
    foreach ($imageData as $index => $image) {
    $imageNumber = $existingImageCount + $index;
    }

    // ...
    // 省略
    // ...
}

すると、foreach文の中の $existingImageCount の方で、赤い波線が表示されました。

その画像が下の物です。

赤い波線のエラー画像

このエラーが出ましたが、問題なく動いています。

この $existingImageCount には値が入っているにもかかわらず、赤い波線が表示されてしまうのは違和感です。

問題が無いなら無視してもいいのですが、ずっと赤い波線が表示されるのは気になります。

対処法

対処法は、変数の前に型を宣言するコメントをつけることです。

エラーを修正した画像

コードだと以下の通りに変更しました。

/**
 * 編集した記事を更新する
 *
 * @return void
 */
private function updateArticle()
{
    // ...
    // 省略
    // ...

    // 既存画像の枚数を取得
    // 更新前の枚数に続いて連番でリネームするため、最後に追加された画像の末尾番号を取得
    /** @var int $existingImageCount */
    $existingImageCount = $this->articleModel->getUploadedImageNextNumber($id);
    if ($existingImageCount === -1) {
      echo "画像の番号のリネームに失敗しました";
      return;
    }

    // 記事画像のリネーム
    foreach ($imageData as $index => $image) {
    $imageNumber = $existingImageCount + $index;
    }

    // ...
    // 省略
    // ...
}

これで赤い波線が消えました。

拡張機能のPHP Intelephense がforeach文の中に入っている変数の型を検知できなかったのかな、というのが推論ですが、他の部分でも似たような処理をしているので謎が残ります。

とはいえ、解決はできました!

おわりに

変数を宣言しているのに赤い波線が出てしまう問題を解決しました。

他の方法で解決したよ、という方がいらしたら教えてください。