PHPで綺麗なコードを書くには、どうすればいいんだろう。
標準的なコーディング規約って無いのかな。
こんにちは。HTMLやPHPの開発歴8年の著者が、PHPのコーディングについて、その大切さと標準的な規約についてご紹介します。
他人の書いたPHPのプログラムを見たとき、ものすごく綺麗に書かれてあるコードを見たことがありますか?逆に、ものすごく見にくいコードを見たことはないでしょうか?
美しいコードを見たときは、コードの解析作業も驚くほどスムーズになって、楽しく作業できます。しかし、何をしているのか全く分からない程にめちゃくちゃなコードほど、ストレスが溜まるものもありませんし、生産性も著しく悪くなります。
コードを綺麗に読みやすく書くということは、プログラミングする上で非常に大切な要素になります。今回は美しいコードを書くためどうすればよいか、コーディングの大切さや一般的なコーディング規約について解説したいと思います。
PHPのコーディング規約とは
コーディング規約とは、変数名の付け方を決めたり、特定の処理を禁止したり、コメントの付け方を決めたり、コードを書くためのルールを定めたものをコーディング規約と言います。
コーディング規約は主にチームでプログラム開発をするときに最初に定められるもので、プロジェクトにとって非常に大切なプロセスになります。
コーディング規約が大切な理由
どうしてそんなにコーディング規約が大切なのでしょうか。それは、次のような状況を想像してみてください。
Aさんは全ての変数名をhensu1、hensu2、hensu3というように、単に数字を違えるだけで命名しました。その結果、変数名を考える手間は省けましたが、変数名を見てもその内容が分かりません。
例えばBさんがそれを見たとき、hensu10が何に使われているかを知るにはその前後のコードをいちいち解析しないと分かりません。これは非常に効率が悪いですね。
これは極端な例ですが、このようにコーディング規約が無いと、チームで実施するプロジェクトなどではコードの意味が不明確になったり、バグの元になったりします。ですので、プロジェクトが大きければ大きいほど、しっかりとしたコーディング規約が必要となってきます。
では、個人でプログラミングを行うなら必要ないのかと言うとそんなことはありません。適当なコーディングをすると、後でコードを見直した時に自分で何を書いていたのかが分からなくなります。
ですので、個人でプログラミングをする場合でも、自分なりの簡単なコーディング規約を用意していた方が良いでしょう。
様々なコーディング規約
ではどんなコーディング規約が良いのかというと、プロジェクトによって様々としか言いようがありません。しかし、それでは手のつけようがありませんので、PHPにおいて世界で標準的に参考にされているコーディング規約をご紹介します。
まずはPSRというPHPコーディング規約があります。PHPのコーディング規約と言えばこれっていう感じの規約で、世界標準的な地位を占めています。
その他にもPHPのフレームワークなどでは別のコーディング規約が使われたりしますが、PSRから派生したものも多いです。例えば、PHPフレームワークとして有名なCakePHPはPSR-2に従っています。
ということで、次の章ではこの標準的なコーディング規約であるPSRについて簡単に説明したいと思います。なお、PSRは規模が大きいため、全て解説はせず、PSR-1とPSR-2と呼ばれるもののみ簡単に説明したいと思います。
コーディング規約PSR-1
PSRは2019年現在で、PSR-1からPSR-19までの種類があります。それぞれ規約の内容が異なるのですが、まずはPSRの基本となる部分のPSR-1を説明したいと思います。
PSR-1の概要
PSR-1には基本的なコーディングについての規約が書かれてあります。書いている内容はシンプルなのですが、こういう基本的な部分からしっかりと規約を守ることで、飛躍的に可読性の高いコーディングが可能になります。
PSR-1の特徴
PSR-1は簡単には以下のような規約となっています。
項目 | 規約 | |
---|---|---|
1 | PHPタグ | <?php ?> もしくは、<?= ?>を使う。 |
2 | 文字コード | UTF-8(BOM無し)を使う。 |
3 | 記述方法 | クラスや関数の宣言処理と、includeやecho等の読込や出力の処理(副作用のある処理)は、記述するPHPファイルを分ける |
4 | 名前空間とクラス | PSR-4規約に従う。つまり、一つのPHPファイルには一つのクラスのみ宣言すること。名前空間は最低でも1レベルは必要で、トップにはベンダー名を付けること。 |
5 | クラス名 | StudlyCaps(単語の先頭を大文字にして、空白は無し)という書き方で命名する。 |
6 | クラス定数名 | 全て大文字で、単語の区切りをアンダースコアにして命名 |
7 | メソッド名 | camelCase(最初の単語の先頭は小文字で、次からの単語の先頭は全て大文字にして、空白は無し)という書き方で命名する |
本当に基本的な部分に対しての規約が書かれてあるので、細かすぎる印象を持ったかもしれません。しかし、複数人のチームなどで開発する場合などは特にこういった内容が重要となります。
例えば、文字コードがUTF-8だったり、Shift_JISだったりすると、それを組み合わせたシステムは文字化けだらけになるでしょう。基本的な部分だからこそ、事前にしっかりとした決め事が必要になります。
PSR-1に則ったコーディングの例
例えば、index.phpファイルにこのようなコードがあったとします。
<? //index.php class Class_Test{ const ClassNumber = 1; function class_method(){ echo 'メソッドを実行'; } } $test = New Class_Test; $test->class_method(); echo $test::ClassNumber; ?>
これは、PSR-1の規約には全く従っていません。まずPHPタグが省略形の<? ?>になっていますし、クラスの宣言とechoなどの出力処理が同じファイルに記述されています。
また、クラス定数名やメソッド名も適当になっていて、規約には則っていません。そうすると、大文字や小文字やアンダースコアがどうなっているか分からなくなり、非常に混乱します。
これを、PSR-1の規約に則って書くと、こうなります。
<?php //class.php namespace VendorModel; //名前空間は最低でも1レベルは必要 class ClassTest{ //クラス名はStudlyCapsで記述 const CLASS_NUMBER = 1; //クラス定数名は全て大文字で、単語の区切りをアンダースコアに function classMethod(){ //メソッド名はcamelCaseで記述 echo 'メソッドを実行'; } } ?>
<?php //index.php include "class.php"; //クラスを宣言したファイルを読み込む $test = New VendorModelClassTest; //名前空間付きでインスタンス化 $test->classMethod (); echo $test::CLASS_NUMBER; ?>
このようにクラスを定義するファイルと、echoなどの副作用のある処理を各ファイルに分けます。そして、クラス名やメソッド名などを規約通りに修正しました。
いかがでしょうか?このように規約に則るだけで、少し可読性が向上したのが分かると思います。
これだと複数人での作業でも、クラス名やメソッド名で悩むことが減りそうです。
コーディング規約PSR-2
では、PSR-1の次の規約に当たるPSR-2はどのような規約なのでしょうか。詳しく見ていきたいと思います。
PSR-2の概要
PSR-2はPSR-1の拡張版というような規約で、より具体的なコードの書き方について記述しています。それにより、コードの内容が間違って捉えられることを防げます。
PSR-2の特徴
PSR-2は簡単には以下のような規約となっています。量が多いため、概要の説明に留めたいと思います。
項目 | 規約 | |
---|---|---|
1 | 基本 | PSR-1に準拠する。 |
2 | インデント | スペース4つを使用して、タブの使用は不可。 |
3 | 行の長さ | 制限を設けてはいけない。しかし、80~120文字以内に抑えるべき。 |
4 | 名前空間 | 定義の後に空行を挟むこと。また、use定義ブロックも同様に空行を挟むこと。 |
5 | クラス・メソッドの括弧 | 開始の括弧はクラス名の次の行に単独で記述し、閉じる括弧は最後の文の次の行に記述すること。 |
6 | アクセス修飾子 | 全てのプロパティ、メソッドで定義すること。 abstractとfinalはアクセス修飾子の前に、staticはアクセス修飾子の後に定義すること。 |
7 | 制御構造 | キーワードの後ろは1スペースを開け、メソッドや関数の呼び出しはスペースを開けないこと。 開始の括弧は同じ行に記述し、閉じる括弧は最後の文の次の行に記述すること。 開始の括弧の後と、閉じる括弧の前にスペースがないこと。 |
少し難しい言葉が出てきますが、意味が分からなくても大丈夫です。PSR-2のコーディング規約の雰囲気だけでも掴んでください。
PSR-2では括弧の位置やスペースの入れ方など、結構細かい規約になっているのが分かると思います。文章だけではどのような規約か分かりにくいので、次の章で実際のコーディング例を紹介します。
PSR-2に則ったコーディングの例
先ほどPSR-1に則ってコーディングした例を再度見てみましょう。PSR-1の説明の時に追加したコメントは除いています。
<?php //class.php namespace VendorModel; class ClassTest{ const CLASS_NUMBER = 1; function classMethod(){ echo 'メソッドを実行'; } } ?>
<?php //index.php include "class.php"; $test = New VendorModelClassTest; $test->classMethod (); echo $test::CLASS_NUMBER; ?>
さて、これはPSR-1の規約には則っていますが、PSR-2の規約には則っていません。インデントのスペース数や、クラス宣言時の括弧の位置が違っています。
これを、PSR-2に則った形に修正してみましょう。
<?php //class.php //インデントを4スペースにする namespace VendorModel; //名前空間の宣言の後に空行を入れる class ClassTest { //制御構文のキーワードの後に1スペース入れる const CLASS_NUMBER = 1; public function classMethod() { //アクセス修飾子を定義し、メソッドのキーワードと括弧の間にスペースは入れない echo 'メソッドを実行'; } } ?>
<?php //index.php include "class.php"; $test = New VendorModelClassTest; $test->classMethod(); //メソッドのキーワードと括弧の間にスペースは入れない echo $test::CLASS_NUMBER; ?>
細かい内容ですが、このような整頓を行うことでスッキリと見やすいコーディングをすることができます。空白の位置やインデントが人によってズレていると、意外と読みにくくなるものです。
まとめ
今回は、PHPのコーディング規約の世界標準とも言えるPSR-1とPSR-2を簡単にご紹介しました。ちょっとしたコーディングの整理によって、可読性が飛躍的に高まったのがお分かりいただけたでしょうか。
コーディング規約については、必ずPSR-1とPSR-2に合わした方が良いということはありません。プロジェクトによって、適したコーディング規約は異なるでしょう。
大事なことは、事前にしっかりとした理由を持ってコーディング規約を作成し、それをちゃんと共有することです。プロジェクトによってはコーディング規約があるのにそれが共有されてなく、結局人によってまちまちなコーディングになっていることがよくあります。
このようにコーディング規約は大切な要素になりますので、是非一度、いくつかのコーディング規約と自分のコーディングを比較してみてください。きっとプログラミング力も向上すると思います。