コーディング規約 > PHPのコーディング規約 > PHPのソースコードのレイアウト
制御構造などのPHPのソースコードのレイアウトは、このページに従ってください
PHPタグの開始は、必ず標準の"<?php"を使用してください。 「php」の部分を省略した形式の"<?"を使用しますと、意図しないエラーになってしまう可能性がありますので、絶対に使用しないでください。
PHPコードのみからなるファイル(htmlファイル以外)では、終了タグ ("?>") は決して含めてはいけません。 詳しくは、PHPファイルのフォーマットのページの綴じタグの項目を参照してください。
文字列がリテラルである (変数の展開などが含まれない) 場合は、シングルクォートで文字列を囲まなければなりません。
1. $string = '文字列の例';
SQL文などのようにリテラル文字列自体にシングルクォートが含まれている場合は、 ダブルクォートで文字列を囲んでもかまいません。
1. $sql = "SELECT id, name from people " 2. $sql .= "WHERE name='Fred' OR name='Susan'";
シングルクォートで囲った文字列内にシングルクォートを出てきた場合は、シングルクォートを「\」でエスケープしなければなりません。それよりも、ダブルクォートで文字列を囲んだ方が読みやすくなるのでお勧めです。
文字列の中で変数の展開を行うには、次の方法を使用してください。
1. $greeting = "こんにちは {$name} さん。ようこそ!";
文字列の連結には 文字列連結演算子(".")を使用しなければなりません。コードを読みやすくするため、 文字列連結演算子の前後には常にスペースを入れなければなりません。
1. $company = 'Setuco' . 'CMS';
文字列を 文字列連結演算子で連結する際には、コードを読みやすくするために ひとつの文を複数行に分けることもできます。
そのような場合は、 2 行目以降の行頭にスペースを入れ、各行の 文字列連結演算子が最初の行の 代入演算子("=")演算子と同じ位置にくるようにしなければなりません。
1. $sql = "SELECT id, name FROM people " 2. . "WHERE name = 'Susan' " 3. . "ORDER BY name ASC ";
添字として負の数を使用してはいけません。
数値添字の配列の添字は、特に理由がない限り、常に0から始めるようにします。
"array()"を使用して数値添字の配列を宣言する場合は、 コードを読みやすくするため、 要素を区切るカンマの後にスペースを入れなければなりません。
1. $sampleArray = array(1, 2, 3, 'Setuco', 'CMS');
"array()"を使用して、複数行にまたがる配列を宣言することも可能です。 その場合は、2 行目以降の行頭にスペースを入れ、各行の開始位置が以下のようになるようにしなければなりません。
1. $sampleArray = array(1, 2, 3, 'Setuco', 'CMS', 2. $a, $b, $c, 3. 56.44, $d, 500);
一方、配列の最初の要素を次の行から始めることもできます。 その場合は、配列を宣言した位置からさらに一段インデントした位置で要素をそろえ、 それ以降のすべての要素を同じインデントで記述するようにします。
閉じ括弧はそれ単体でひとつの行に記述し、インデント量は配列の宣言と同じ位置になります。
1. $sampleArray = array( 2. 1, 2, 3, 'Setuco', 'CMS', 3. $a, $b, $c, 4. 56.44, $d, 500, 5. );
この宣言を使用する際は、配列の最後の要素の後にもカンマをつけておくようにしましょう。 そうすることで、配列に新たな要素を追加したときにパースエラーが発生する危険性を 少なくできます。
連想配列を"array()"で宣言する場合には、 適宜改行をいれて複数行で宣言するようにしましょう。その場合は、2行目以降の行頭などにスペースを入れ、キーと値の位置がそれぞれ揃うようにしなければなりません。
1. $sampleArray = array('firstKey' => 'firstValue',
2. 'secondKey' => 'secondValue');
一方、配列の最初の要素を次の行から始めることもできます。その場合は、配列を宣言した位置からさらに一段インデントした位置で要素をそろえ、それ以降のすべての要素を同じインデントで記述するようにします。
閉じ括弧はそれ単体でひとつの行に記述し、インデント量は配列の宣言と同じ位置になります。可読性を高めるため、代入演算子 "=>"の位置はそろえておかなければなりません。
1. $sampleArray = array( 2. 'firstKey' => 'firstValue', 3. 'secondKey' => 'secondValue', 4. );
この宣言を使用する際は、配列の最後の要素の後にもカンマをつけておくようにしましょう。 そうすることで、配列に新たな要素を追加したときにパースエラーが発生する危険性を 少なくできます。
開始波括弧は常にクラス名の下に書かなければなりません。
PHPDocumentorの標準形式のドキュメントブロックがなければなりません。
クラス内のコードは、すべてスペース4文字で字下げします。
ひとつのPHPファイルにはクラス定義をひとつだけ含めるようにします。
特に理由がない限り、クラスファイルの中にクラス以外のコードを追加してはいけません。
クラス宣言の例です。
1. /**
2. * これがドキュメントブロックです
3. */
4. class SampleClass
5. {
6. // クラスのすべての内容は、
7. // スペース 4 文字の字下げを使用します。
8. }
他のクラスを継承したりインターフェイスを実装したりしているクラスの宣言は、可能な限りその依存関係も同じ行に含めるようにしなければなりません。
1. /**
2. * これがドキュメントブロックです
3. */
4. class SampleClass extends FooAbstract implements BarInterface
5. {
6. }
このように宣言しようとした結果、もし行の長さが 最大文字数 を超えてしまう場合は、キーワード"extends"や"implements"の前で改行してインデント量を一段増やします。
1. /**
2. * これがドキュメントブロックです
3. */
4. class SampleClass
5. extends FooAbstract
6. implements BarInterface
7. {
8. }
複数のインターフェイスを実装していて宣言が行の最大長を超える場合は、 インターフェイスを区切るカンマの後で改行して インターフェイス名の位置がそろうようにインデントします。
1. /**
2. * これがドキュメントブロックです
3. */
4. class SampleClass
5. implements BarInterface,
6. BazInterface
7. {
8. }
クラスの内部で使用する変数は、クラスの先頭 (あらゆるメソッド宣言より前) で宣言する必要があります。
var構文を使ってはいけません。
メンバ変数を宣言する際には"private"、"protected"のいずれかの修飾子を用いてアクセス範囲を指定します。 特に理由がない限り、メンバ変数を"public"宣言してはいけません。
他のクラスからメンバ変数にアクセスするときは、アクセサメソッド("set"&"get")を定義してそのメソッドを使用するようにしてください。
クラス内でメソッドを宣言する際には、常に "private"、"protected"あるいは"public"のいずれかの修飾子を用いてアクセス範囲を指定しなければなりません。
クラスと同様、波括弧は関数名の次の行に書かなければなりません。 関数名と引数定義用の開始括弧の間にはスペースを入れてはいけません。
グローバルスコープの関数(クラスメソッドではない関数)は、特に理由がない限り使用しないようにしましょう。
クラス内の関数宣言の例として適切なものを次に示します。
1. /**
2. * これがドキュメントブロックです
3. */
4. class Foo
5. {
6. /**
7. * これがドキュメントブロックです
8. */
9. public function bar()
10. {
11. // 関数のすべての内容は、
12. // スペース 4 文字の字下げを使用します。
13. }
14. }
引数リストが 行の最大文字数 を超える場合は改行できます。 関数やメソッドの引数を改行して続ける場合は、その宣言部よりさらに一段インデントしなければなりません。
そして、閉じ括弧の前にさらに改行を入れます。 宣言部の閉じ括弧と本体の開始波括弧はスペースをひとつはさんで同じ行に記述し、 そのインデント量は関数やメソッドの宣言位置と同じになります。
1. /**
2. * これがドキュメントブロックです
3. */
4. class Foo
5. {
6. /**
7. * これがドキュメントブロックです
8. */
9. public function bar($arg1, $arg2, $arg3,
10. $arg4, $arg5, $arg6
11. ) {
12. // 関数のすべての内容は、
13. // スペース 4 文字の字下げを使用します。
14. }
15. }
関数の引数を指定する際は、引数を区切るカンマの後にスペースをひとつ入れます。 例えば3つの引数を受け取る関数をコールする場合の例は、以下のようになります。
1. threeArguments(1, 2, 3);
制御構造が多重にネスト(入れ子)されすぎていますと、ソースコードの可読性が低くなってしまいます。 ですので、制御構造のネストは最大でも4回までにしてください。
"if"および"elseif"系の制御構造では、条件を指定する括弧の前にスペースをひとつ入れなければなりません。また、条件指定の括弧を閉じた後にもスペースをひとつ入れなければなりません。
括弧で囲まれた条件文の中では、演算子の前後にもスペースをいれなければなりません。また、条件の論理的な区切りを明確にするため、 条件文の中でも積極的に括弧を使用することを推奨します。
開始波括弧は、条件文と同じ行に記述します。終了波括弧は、常に改行してそれのみで記述します。波括弧の中では、スペース 4 文字の字下げを使用します。
1. if ($a != 2) {
2. $a = 2;
3. }
条件文が行の最大文字数 を超え、さらに複数の条件がある場合は、それらを複数行にわけて記述できます。その場合は論理演算子の前で改行し、条件句の最初の文字がそろうように位置を合わせます。
条件部の閉じ括弧と本体の開始波括弧はスペースをひとつはさんで同じ行に記述し、そのインデント量は制御構文の開始位置と同じになります。
1. if (($a == $b)
2. && ($b == $c)
3. || (Foo::CONST == $d)
4. ) {
5. $a = $d;
6. }
後者の記法の意図は、後から条件句を追加したり削除したりしたときに問題が起こりにくくすることにあります。
"elseif"あるいは"else"を含むif文の場合の決まりは、通常の"if"と同じです。 次の例は、"if"文に"else"や"elseif"が含まれる場合のものです。
1. if ($a != 2) {
2. $a = 2;
3. } else {
4. $a = 7;
5. }
6.
7. if ($a != 2) {
8. $a = 2;
9. } elseif ($a == 3) {
10. $a = 4;
11. } else {
12. $a = 7;
13. }
14.
15. if (($a == $b)
16. && ($b == $c)
17. || (Foo::CONST == $d)
18. ) {
19. $a = $d;
20. } elseif (($a != $b)
21. || ($b != $c)
22. ) {
23. $a = $c;
24. } else {
25. $a = $b;
26. }
場合によっては、これらの文で波括弧が必要ないこともあります。しかし、このコーディング規約では、このような例外を認めません。"if"、"elseif"あるいはelse文では、常に波括弧を使用しなければなりません。
"switch"を使用した制御文では、条件を指定する括弧の前にスペースをひとつ入れなければなりません。また、条件指定の括弧を閉じた後にもスペースをひとつ入れなければなりません。
"switch"文の中身は、スペース4文字の字下げを使用します。 各"case"文の中身は、さらに4文字ぶん字下げします。
1. switch ($numPeople) {
2. case 1:
3. break;
4.
5. case 2:
6. break;
7.
8. default:
9. break;
10.
11. }
"switch"文の"default"は、決して省略してはいけません。
注意: 各"case"の最後に"break"や"return"を記述せず、意図的に次の"case"に処理を流すという書き方をする場合もあるでしょう。
これらの場合を単なる記述漏れと区別するために、"case"文で"break"あるいは"return"を指定しなかった場合は 「意図的に break を省略した」というコメントを含めるようにします。
10行以上のループ処理をする場合は、"$i", "$key", "$value"などのループ変数名をつけないで、できるだけわかりやすい変数名を 命名してください。
ループ文は、スペース4文字の字下げを使用します。 制御構造がネストする度に、さらに4文字ぶん字下げします。
ループ文のレイアウト(書き方)は以下のサンプルにしたがってください
1. for ($i = 0; $i < 10; $i++) {
2.
3. }
1. while (true) {
2.
3. }
1. foreach ($array as $key => $value) {
2.
3. }
1. for ($i = 0; $i < 10; $i++) {
2. if ($i === 7) {
3. continue;
4. }
5. }
Viewファイル(スクリプトファイル)の制御構造は波括弧ではなくコロン形式にしてください。
1. <?php if ($hoge) { ?>
2. <h1>テスト</h1>
3. <p> smaple </p>
4. <?php } ?>
1. <?php if ($hoge): ?> 2. <h1>テスト</h1> 3. <p> smaple </p> 4. <?php endif; ?>
HTMLのタグが入ることにより、if文などの制御構造の行数は長くなってしまい、波括弧で閉じると何の制御構造を 閉じたのかがわかりません。
コロン形式の場合はどの制御構造を閉じているのかが一目でわかるので、コロン形式で書いてください。
HTMLのタグや文字列を出力するとき、<?= 'String' ?>で出力すると意図しないエラーになってしまう可能性があります。出力するときはかならず<?php echo 'String' ?>の形式で出力してください。
各PHPファイルには、PHPDocumentorの形式に従ったインラインドキュメントを記述しなければなりません。
詳細は、PHPのコーディング規約_インラインドキュメントを参照してください。