連載
» 2018年09月18日 05時00分 公開

Visual Studio Code+PHPの可能性を探る:まだある! PHPプログラミングを支援する拡張機能 (1/2)

PHPのコーディング規約を利用したコードチェックと整形を行う拡張機能や、DocBlockの記述を支援してくれる拡張機能を紹介。

[かわさきしんじ,Insider.NET編集部]
「Visual Studio Code+PHPの可能性を探る」のインデックス

連載「Visual Studio Code+PHPの可能性を探る」

 前回は、Visual Studio Code(以下、VS Code)でPHPコードの記述/デバッグ実行を行う上で必須ともいえる2つの拡張機能を紹介した。今回は、PHPプログラミングで利用できる以下のような拡張機能を紹介していこう。

 以下では、前回に作成したコードを例に、これらの拡張機能を見ていこう。なお、本連載ではWindows 10 Proの環境上に、XAMPPを用いて構築したPHP開発環境を使用している(PHPのバージョンは7.2.9。XAMPPのインストールは完了しているものとする)。他のOSや環境、PHPのバージョンでは、本連載の記述とは異なる部分があるかもしれないことには注意されたい(パスの記述など)。

phpcs拡張機能とphpcbf拡張機能

 phpcs拡張機能phpcbf拡張機能は、PHP_CodeSnifferが提供するコード規約チェック機能やコード規約に沿ったコード整形機能(PHP Code Beautifier and Fixer)をVS Codeから使用できるようにするためのツールだ。これらを使用するには、事前にPHP_CodeSnifferをインストールしておく必要がある(インストール方法については、phpcs拡張機能のドキュメントを参照されたい)。なお、以下ではPHP_CodeSnifferを単に「phpcs」と、VS Codeとのブリッジとなっている拡張機能については「phpcs拡張機能」と記述する。

 これら2つの拡張機能(とphpcs)をインストールした状態で、前回に作成した以下のPHPコードをPHPのコーディング規約に準拠するように修正していこう(ここではC:\xampp\htdocs\vscodephp_02ディレクトリを作成して、前回作成したHTML/PHPコードと、VS Codeの設定ファイルであるsettings.json/launch.jsonファイルをそのままコピーした。ただし、時刻判定のロジックを間違えていたので、そこは修正した)。

<?php
date_default_timezone_set('Asia/Tokyo');
$d = getdate();
$h = $d["hours"];

if (6 <= $h && $h <= 11)
  $msg = "Good morning!, ";
elseif (12 <= $h && $h <= 18)
  $msg = "Good afternoon!, ";
elseif (19 <= $h && $h <= 22)
  $msg = "Good evening!, ";
else
  $msg = "Good night!, ";

print($msg . $_POST["whom"]);


前回作成したPHPコード(に修正を加えたもの)

 VS Codeでvscodephp_02ディレクトリを開くと、早速コードのチェックが行われ、次のような画面が表示される(ステータスバー左端をクリックして、「問題がある」とphpcs拡張機能が判断した出力もウィンドウ下部に表示している)。

phpcsによるコードチェックの結果 phpcsによるコードチェックの結果

 phpcsが「問題あり」と判断した部分については、その重大度に応じて、赤い下線(エラー)や緑の下線(警告)を使って注意が促される。下線が引かれた部分にマウスカーソルを持っていけば、上の画像のように「何が問題か」をポップアップ表示してくれる。

 例えば、上の画像では、行末コードがLF(\n)ではなくCRLF(\r\n)である点と、DocBlock(関数、クラス、ファイルなどについての情報を含めた「PHPDoc」を「/** 〜 */」というDocCommentで囲んだもの)をファイル冒頭に記述していない点をエラーとして判定されている(赤い下線)。また、if文(制御構造)をPHPファイル中に直接記述している点が警告されている(関数にすべき)。PHPのDocBlockについては、この後に紹介するPHP DocBlockerで何とかすることにして、取りあえずはインラインに記述したif文を関数にまとめてみる(改行コードについては今回は無視する)。

<?php

function createMessage($h) {
  if (6 <= $h && $h <= 11)
    $msg = "Good morning!, ";
  elseif (12 <= $h && $h <= 18)
    $msg = "Good afternoon!, ";
  elseif (19 <= $h && $h <= 22)
    $msg = "Good evening!, ";
  else
    $msg = "Good night!, ";
  return $msg;
}

date_default_timezone_set('Asia/Tokyo');
$d = getdate();
$h = $d["hours"];

$msg = createMessage($h);

print($msg . $_POST["whom"]);


修正後のPHPコード

 単にif文の内容をcreateMessage関数にまとめ、もともとif文があったところにはcreateMessage関数を呼び出すコードを記述している。では、phpcsでこのコードをチェックすると、次のようになる。

phpcsによるチェック結果 phpcsによるチェック結果

 先ほどよりも、問題が多くなってしまった。そのうちの幾つかは画面幅の都合から、本フォーラムではタブ幅を2としているが、これが「Line indented incorrectly」と判断されたことが原因だ。それ以外には、if文で波かっこを使わずにインラインで各節を記述していることや、関数定義の開きかっこの位置が問題とされている(DocBlock関連のエラーについては次節まで無視する)。

 手作業でこれらの問題を修正してもよいのだが、phpcbf拡張機能を使うことで、簡単にPHPコードの整形を行える。以下のGIFアニメにも示した通り、コードの整形を行うには、PHPコードをVS Codeのエディタ画面に開いた状態で、エディタのどこかを右クリックしてコンテキストメニューから[ドキュメントのフォーマット]を選択するだけだ。

phpcbf拡張機能によるコード整形 phpcbf拡張機能によるコード整形

 phpcs/phpcbf拡張機能を使って、前回のコードを(ある程度)修正することで、(改行コードと)DocBlockが残された問題となった。

修正後のPHPコードではDocBlockがないことが問題となっている 修正後のPHPコードではDocBlockがないことが問題となっている

 これを修正するには、次に紹介するPHP DocBlockerを使うのが便利だ(なお、PHPのコーディング規約を基にコードをチェックしたり、修正したりする拡張機能は他にもある。興味のある方はVS Marketplaceで検索してみよう 。

       1|2 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。