今、PHPのコーディング規約のデファクト・スタンダード(事実上のスタンダード)になっているPSRですが、2年ぐらい見てないうちに番号が相当進んでいました。
PSR-0, PSR-1, PSR-2, PSR-4 ぐらいだと思っていた人は相当古いです。すでに番号は18まで進んでいます。
PSRとは何か?
PSRは PHP Standards Recommendations の略で、PHPのコーディング規約のひとつです。
PHP-FIGが策定したPHP標準勧告のことで、PHP-FIG は PHP Framework Interop Group の略で日本語に訳すと『PHPフレームワーク相互運用グループ』。
PHPプロジェクトが集まって意見を出し合い、お互いの製品の互換性を調整する団体です。
CakePHP や Laravel など有名なフレームワークが多く参加していて、PSR は PHPコーディング規約のデファクト・スタンダードになりつつあります。
PHPを勉強しているなら、まずこのコーディング規約を守るのが一番。
PSRは相当変わってる
ここ2年くらいPSRのことについてチェックしてなかったんですが、相当変わってます。PSR-0, PSR-1, PSR-2, PSR-4 くらいしか見てない人は相当古い。
PSRはコーディング規約を機能ごとに割り振り番号で表現しているんですが、ボクは番号が大きくなると前の番号を含んでいるという認識でした。
が、改めてドキュメントを見直すとこうなってる。
元々こうなってるのに気づいていなかったのか、あとで変わったのか今となっては分かりませんが、ボクと同じように思っている人は注意が必要。
PSR-1 が基準
PSRは番号で機能ごとに分かれています。
PSR-0 | Autoloading Standard |
PSR-1 | Basic Coding Standard |
PSR-2 | Coding Style Guide |
PSR-4 | Autoloading Standard |
PSR-0を元に肉付けしていくイメージをしやすいですが、基準はPSR-1。'<?php' で始まっているか? など超基本的な構文。
PSR-0は、ネームスペースとクラス名、それを記述したファイル名、パスの規定。
ベーシックが0になっていないのは、PHPは元々、指向プログラミングじゃなかったからだと思う。
PSR-1は、文字コードはBomなしUTF-8、1行の文字数は120行などのスタイルを規定。PSR-4はPSR-0の拡張版。
PSR-2のコーディング規約を守れば、クラスやインタフェースを用いたオブジェクト指向とそれらを使わない非オブジェクト指向の基本的なコーディング規約を網羅できます。
静的コードチェックと関係が深い PSR-0, PSR-1, PSR-2, PSR-4 。
PSRで0, 1, 2, 4がメインに考えられているのは、PHP_CodeSniffer などを用いた静的コードチェックツールの範疇だから。
PSR-0ならファイル名やクラス名などしかチェックしない、PSR-1ならそれに加えて '<?php' から始まっているか? などのチェック、PSR-2 なら、さらに文字コードはUTF-8、1行は120文字以内に収まっているか? などをチェックします。
PSR-2 でチェックを行えば、PHPコードの基本的な構文は網羅されるのでツールで自動的に整形することも可能。
2021年9月。最新のコーディング規約はPSR-12
静的コードチェックツールの範囲内にあるPSRは相当変わってます。2年も放置するとこうなるか、といういい例。
PSR-0 | 非推奨。 PSR-4を使う。 Autoloading Standardの統合。 |
PSR-2 | 非推奨。 拡張版のPSR-12へ移行。 PSR-1を含む。 Coding Style Guide ↓ Extended Coding Style Guide |
PSR-1 | Basic Coding Standard |
PSR-4 | Autoloading Standard |
PSR-12 | Extended Coding Style Guide |
注意が必要なのは、チェックツールがPSR-12に対応しなければ使えません。またツールのバージョンが古ければPSR-0, PSR-2 も使えます。
共通化団体が非推奨にしたものを使い続けるのはおすすめしませんが、古いソースコードを使ってて新たにPSR-12に対応したくないということもあるでしょう。
そのへんはケースバイケースでいいと思います。先送りの末に放置すると、期間が長くなればなるほど修正箇所が増えるので面倒のリスクが広がりますが。
その他の番号はどういうもの?
PSR-0, 1, 2, 4, 12 以外はどう関係してくるか? ですが、その他の番号は、これらの静的チェックツールの範疇ではありません。
また、お互い独立していて干渉しません。
(たとえば、PSR-15 は PSR-2 を前提としていないし、 PSR-2 は PSR-15 を守る義務はない。)
だからと言って無視はいけません。たとえばロガー(ログ処理)のインタフェースを定義しているPSR-3や、HTTP通信のクラス設計を定義している PSR-7, 15, 17, 18 など、どのシステムでも使えるものがあります。
このように移植しやすいものは、コーディング規約を守ったほうが保守・メンテナンスの面で有用です。同じ処理だったらプロジェクトが変わってもコードが読みやすいし修正しやすいですからね?
こういうことのためにPHP-FIGは存在しています。
『静的チェックツールの範疇ではない』と言いましたが、実情は分かりません。
ツールがHTTP通信のコーディング規約も入れてるということもあるでしょう。
そのへんはツール次第です。
PSR-0, 1, 2, 4, 12 が抜けてることはないです。非推奨にならない限り。
じゃないとツールの性能を疑う。