この記事は最後に更新してから1年以上経過しています。

WordPressのコーディングスタンダードとPSR-2がかみ合わない

説明

先日パソコンのストレージを換装して開発環境を再構築。エディタのEclipseは「Neon(4.6)」から「Oxygen(4.7)」へ切り替わった。コードを書き始めるとそこはかとなく違和感があり、調べていくとPHPの「Code Style(Formatter)」が「PSR-2」に設定されていることが原因だった。

PSR-2とは

「PSR-2」はPHP-FIGによって策定されたPHPコーディングスタイルガイドである。このコーディングスタイルはWordPressの「PHP Coding Standards(以下、WordPress Standards)」と異なる部分がある。主な違いは次の通り。

 WordPress StandardsPSR-2
クラス・メソッドの開き括弧{名前の次行に記述
インデントタブを使う4つのスペースを使う
開き中括弧(の後と閉じ中括弧)の前スペースありスペースなし

コードで比較

次はPSR-2のクラス定義は以下のような感じになる(ここでは名前空間の宣言は割愛)。

<?php
class ClassName
{
    public function methodName($arg1, $arg2 = null)
    {
        if ($arg1 === $arg2) {
            // if body
        } elseif ($arg1 > $arg2) {
            // elseif body
        } else {
            // else body
        }
    }
}

上記のコードを「WordPress Standards」に合わせてみる。なおクラスやメソッドの開き括弧{はWordPressのクラス定義を参考に行末とした(これは明文化されていない)。

<?php
class Class_Name {
	public function method_name( $arg1, $arg2 = null ) {
		if ( $arg1 === $arg2 ) {
			// if body
		} elseif ( $arg1 > $arg2 ) {
			// elseif body
		} else {
			// else body
		}
	}
}

インデントの違いは一目瞭然だが、ifのような制御構造におけるスペースの使い方が異なっていることがわる。

 WordPress StandardsPSR-2
メソッド・関数名と開き中括弧(の間スペースなしスペースなし
カンマ,の後スペーススペース
制御構造キーワードと開き中括弧(の間スペーススペース
開き中括弧(の後スペーススペースなし
閉じ中括弧)の前スペーススペースなし
閉じ中括弧)と開き括弧{の間スペーススペース

両者に共通するルールはいくつも存在するが、開き中括弧(の後と閉じ中括弧)の前のスペースの有無が見た目の印象を大きく変えている要因といえるだろう。

実践できていなかったこと

さて今回「PSR-2」と「WordPress Standards」を見ながら、これまでなんとなく(惰性的に)やっていたことを変えていこうと思った。

1つ目は「else if」。通常、コロン構文は使っておらず、そこはかとなく「elseif」が嫌だったため、「else if」を使用していた。これにより特に問題はなかったが、「PSR-2」「WordPress Standards」とも「elseif」の使用を推奨していることを踏まえ、今後は「elseif」に切り替えたい。

2つ目は論理NOTの「!」と型キャストの後のスペース。これまでスペースを入れてこなかったが、今後は「PHP Coding Standards」に合わせてスペースを入れるようにしたい。

3つ目は次のswitch制御内で意図的に処理をスルーさせる場合の「no break」コメント。これは「PSR-2」に記載されていることだが、明示的にコメントを入れる方が他者だけでなく未来の自分もわかりやすいと思うのでぜひ実践していきたい。

4つ目はプロパティ定義の「var」。これは「PSR-2」を読んで深く反省。今後は「var」ではなくプロパティの用途に応じて「public」「protected」「private」を適切に使い分けていきたい。

今回保留したこと・まとめ

最後に「PSR-2」では「クラスのプロパティ名やメソッド名において、それが「protected」や「private」を示す意図で1字のアンダースコア_をプレフィックスを使用すべきではない」としている。こちらについては明確な理由がわからなかったため、とりあえず保留とした。世の中の「PSR-2」の採用状況はどんな感じなのだろう。


最終更新 : 2018年05月27日 10:42

お勧め

get_post_time(2018年5月27日 更新)

mixed get_post_time( [ string $d = 'U' [ , bool $gmt = false [ , mixed $post = null [ , bool $translate = false ] ] ] ] )
パラメータ$dで指定されたフォーマットに従って投稿データの投稿時刻を取得する。

has_tag(2012年1月17日 更新)

bool has_tag( [ mixed $tag = '' [ , mixed $post = null ] ] )
投稿記事に投稿タグが付属しているか調べる。

delete_term_meta(2018年5月27日 更新)

bool delete_term_meta( int $term_id, string $meta_key [ , mixed $meta_value = '' ] )
タームのメタ情報を削除する。

wp_save_post_revision(2023年4月3日 更新)

int | WP_Error | void wp_save_post_revision( int $post_id )
現状の投稿のリビジョンを作成する。

safecss_filter_attr(2023年3月31日 更新)

string safecss_filter_attr( string $css [ , string $deprecated = '' ] )
インラインスタイルをサニタイズする。