よりよいコードを記述するために
目次 [閉じる]
- 1. より良いPHPerになるための20Tips
- 1.1. 1. <?php と ?> を使う
- 1.2. 2. 設定ファイルを分離する
- 1.3. 3. コメントは友達
- 1.4. 4. インデントとスペースを使う
- 1.5. 5. 変数名に意味を持たせる
- 1.6. 6. 変数を初期化する
- 1.7. 7. 返り値は常に false を返す、true ではない限り
- 1.8. 8. 連想配列のキーにアクセスする場合はクォートで囲う
- 1.9. 9. echo するときに「,(コンマ)」を使う
- 1.10. 10. 三項演算子を使う
- 1.11. 11. 真偽値の判定には「===」を使う
- 1.12. 12. ++ と -– の演算子を使う
- 1.13. 13. 代入演算子を使う
- 1.14. 14. 変数のdump関数を作る
- 1.15. 15. 定数を使う
- 1.16. 16. $_GET と $_POST を使う
- 1.17. 17. 関数の代わりにオブジェクトを使う
- 1.18. 18. メソッドチェインを使う
- 1.19. 19. コードの繰り返しを止めよう
- 1.20. 20. 結合度を減らし、独立性を保つこと
- 1.21. より良いPHPerにならないための20Tips
より良いPHPerになるための20Tips
参照記事→20 Tips you need to learn to become a better PHP Programmer
記事を参考にしながら筆者なりの意見を書き入れてみました。良いコードというのは常に考える必要があると思います。また、良いコードの認識や記述方法などは、プログラマーのレベルに依存すると思いますので、賛成意見や反対意見を取り入れながら成長させていくことになるでしょう。
初心者はまず、「良いコードとは?」ということを意識することが大切だと思います。意識して実践するにはコーディングの指針を決めることが良いと思います。指針は常に変更して改善させることになると思います。
以下は、コードを記述する際の一つの指針になると思います。初心者にとっては以下のことを考え実践していくことは非常に大切なことだと思います。一度試して見てください。その上で自分なりに様々な意見を取り入れ、改善し、よいコードを記述することを心がけていきましょう。
また、良いコードを書くには良いコードを見ることが大切ですね。WordPressなどを参考にするのもいいと思います。
1. <?php と ?> を使う
「<?…?>」は他のサーバーで動かない可能性があります。
同様に、変数を echo するときもショートタグの使用を避けましょう。
「<?php…?>」を使えばポータブルなコードになります。
1 2 3 4 5 | <? ... ?> //× <?php ... ?> //○ <?=$Var?> //× <?php echo $Var ?> //○ |
2. 設定ファイルを分離する
そして、設定ファイルはスクリプトの頭でインクルードしましょう。
こうしておけば、設定を書き換える必要が出てきても、設定ファイルの一部を書き換えるだけで済みます。
ファイルのインクルードはとても簡単です。
1 2 3 | <?php include("config.php"); // code goes here … |
※設定ファイルはドキュメントルート以外に設置するとセキュリティー上よいでしょう。
3. コメントは友達
そんな時、コメントはそのときに考えていたことを思い出させてくれます。
1 2 3 4 5 6 7 | <?php // Comment # Comment /* Paragraph Comment Paragraph Comment Paragraph Comment */ |
※コードの正確な説明というよりは、そのコードは何を求めようとしているのかなどの目的を記述するのがいいのではないかと思います。
4. インデントとスペースを使う
不適切にインデントされたコード。
1 2 3 4 5 6 | <?php function dothisformula($a,$b) { $c = $b+$a; $e=3; while ($c < 20) { $e = $e - 1; $c = $c + 1; } return $e; } |
適切にインデントされたコード。
1 2 3 4 5 6 7 8 9 10 | <?php function dothisformula($a, $b) { $c = $b + $a; $e = 3; while ($c < 20) { $e = $e - 1; $c = $c + 1; } return $e; } |
5. 変数名に意味を持たせる
また、良いコードを見て参考にするのがいいと思います。
データの型まで分かると更に良いでしょう。
例えば、integer型の変数には、変数名のプレフィックスとしてiをつける。
こうすれば意図しているデータ型も名前から判別できます。
変数に型宣言しないPHPにおいて、これは特に重要です。
1 2 3 4 5 6 7 8 9 10 11 12 | <?php $iNumber = 10; // For Integers $sName = "Marc"; // For Strings $fPi = 3.14159265; // For Floats $aNames = array(); // For Arrays $oUser = new User(); // For Objects $bIsMember = false; // For Booleans |
※型付けの弱い言語であるPHPでは、上記のように変数名に型を判別できる名前を付与したとしても、実際に違う型のデータでも全く問題なく使用できます。変数名はデータ型を保障するものではありません。
6. 変数を初期化する
変数を使う前に初期化するのは良い癖です。
変数を初期化すると警告が出なくなりますし、空の変数を使用するので汚染リスクが無くなり、セキュリティーが向上します。
1 2 3 4 5 6 7 8 9 10 11 | <?php $sString = '';//文字列 $iInteger = 0;//整数 $bBoolean = false;//論理値 //Boolean is False, unless True $aArray = array();//配列 $object = NULL;//オブジェクト |
7. 返り値は常に false を返す、true ではない限り
望む「値」以外は常に false を返すように記述しましょう。
悪い例:
1 2 3 4 5 6 | <?php function getStatus() { $bReturn = true; if ($i != 2) $bReturn = false; return $bReturn; } |
良い例:
1 2 3 4 5 6 7 8 | <?php function getStatus() { $bReturn = false; if ($i == 2) $bReturn = true; else if ($i == 1) $bReturn = false; else throw new Exception("bad status! $i"); return $bReturn; } |
2番目の例は、あなたの書いた if文 が間違っている場合には有効です。
正しいデータが入力されるまでは、動かないコードを書くべきです。
8. 連想配列のキーにアクセスする場合はクォートで囲う
1 2 3 | <?php $sName = $aNames['marc']; $sName = $aNames[marc]; |
2つ目のコードは、PHPはまず始めに、 marc と名付けられた定数を探しに行き、もし存在すればその値に置き換えます。
連想配列のキーにアクセスする場合はクォートで囲うようにしましょう。
9. echo するときに「,(コンマ)」を使う
なぜなら、「.(ドット)」を使うよりも僅かに速くなるからです。(以下のコードでテストした場合)。
カンマ
1 2 | <?php echo "Hello, my name is ", $sName; |
ドット
1 2 | <?php echo "Hello, my name is " . $sName; |
10. 三項演算子を使う
通常のif文
1 2 3 | <?php if ($a == 1) $b = 2; else $b = 3; |
三項演算子を使用した場合
1 2 | <?php $b = ($a == 1) ? 2 : 3; |
三項演算子は下記のように使用されます。
1 2 3 | <?php $variable = (CONDITION) ? IFTRUE : IFFALSE; Use === for Boolean Checks |
11. 真偽値の判定には「===」を使う
1 2 3 4 | 1 <?php 2 if ($bIsMember == true) { ... } // Incorrect 3 if ($bIsMember === true) { ... } // Correct 4 Use ++ and — Operators |
12. ++ と -– の演算子を使う
悪い例:
1 2 3 | <?php $iNumber = $iNumber + 1; $iNumber2 = $iNumber2 - 1; |
良い例:
1 2 3 | <?php $iNumber++; $iNumber2--; |
この演算子の優れているところは、他演算の実行中でも使えることです。(例えば、if文とかwhile文)。
++や-–の演算子は、変数の前に置くか、後に置くかで、動作が異なります。
前に置けば、その動作が完了する前に、後に置けば、その動作が完了した後にインクリメント、あるいはデクリメントが実行されます。
以下の例を参考にしてみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php $iNumber = 10; while ($iNumber++ == 10) { ... } // インクリメント演算子が、比較後に実行されます。 // このwhileの中は1度だけ実行されます。 $iNumber = 10; if (--$iNumber == 10) { ... } // デクリメント演算子が、比較前に実行されます。 // このifの中は1度も実行されません。 $iNumber = 10; $iTotal = $iNumber++; // $iTotalは10。 $iNumber = 10; $iTotal = --$iNumber; // $iTotalは9。 |
13. 代入演算子を使う
悪い例
1 2 3 4 5 | <?php $a = $a + $b; $a = $a * 5; $a = $a - $d; $a = $a / 3; |
良い例:
1 2 3 4 5 | <?php $a += $b; $a *= 5; $a -= $d; $a /= 3; |
文字列にも使用できます。
1 2 3 | <?php $sString = $sString . "hello"; $sString .= "hello"; |
14. 変数のdump関数を作る
さらに簡単にするために、次のような関数を作っておきましょう。変数の確認が迅速に簡単にできるようになります。
1 2 3 4 5 6 | <?php function P($var) { echo '<div align="left" style="background-color:white;color:black;">'; print_r($var); echo '</div>'; } |
15. 定数を使う
頻繁にアクセスするような、例えばディレクトリパスやエラーメッセージなどです。
定数名には、全て大文字を使うことが慣例になっています。
1 2 3 | <?php define ("DIRECTORY","/path/to/site/"); echo DIRECTORY; |
16. $_GET と $_POST を使う
1 2 3 4 5 6 7 8 | <?php $sAction = ''; if($_GET['actions'] == 'actions') $sAction = $_GET['actions']; $sName = ''; if($_POST['actions'] == 'actions') $sName = $_POST['actions']; |
※フィルタリングはセキュリティー上非常に重要です。フォームから入力されたデータ等、外部からのデータはすべてフィルタリングするようにしましょう。
1 2 3 4 5 | //安全な変数 $sName = 'tryphp'; //汚染リスクのある変数 $sName = $_POST['tryphp']; |
17. 関数の代わりにオブジェクトを使う
1 2 3 4 5 | <?php function getProducts($iParameter1, $iParameter2, $iParameter3, $iParameter4, $iParameter5, $iParameter6, $iParameter7, $iParameter8, $iParameter9) { ... } |
こうすることが出来ます。
1 2 3 4 5 6 | <?php $oProducts->setParameter1(...); $oProducts->setParameter3(...); $oProducts->setParameter5(...); $oProducts->setParameter6(...); $oProducts->getProducts(); |
※あまり変わらないような気もします。多すぎる引数が設定されている場合は設計を考えてみましょう。どのような場合にオブジェクトが有効なのかみなさんも自分なりに考えて見てください。
関数の引数が多い場合は連想配列にまとめてから関数の引数として渡すのがよいと思います。
1 2 3 4 5 6 7 8 9 | <?php $aParameter = array( 'iParameter1' => $iParameter1, 'iParameter2' => $iParameter2, 'iParameter3' => $iParameter3, 'iParameter4' => $iParameter4, 'iParameter5' => $iParameter5 ); function getProducts($aParameter) { ... } |
18. メソッドチェインを使う
次のコードは、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php class User { function setThis($iVar) { .... return $this; } function setThis2($iVar2) { .... return $this; } } |
下記のようにメソッドチェインに書き換えることが出来ます。
1 2 3 4 | <?php $oUser = new User(); $oUser->setThis(...) ->setThis2(); |
19. コードの繰り返しを止めよう
この作業はとても面倒ですが、アプリケーションが大きくなればなるほど、その対価を支払う価値があります。
例
1 2 3 4 5 6 7 8 9 | <?php $a = 1; while ($a < 10) { $b = $a * 10; $c = $b * 2; $d = $c * $b; echo $d; $a++; } |
次のように書き換えられます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php function multiply($iVar, $iVar2) { return ($iVar*$iVar2); } $a = 1; while ($a < 10) { $b = multiply($a, 10); $c = multiply($b, 2); $d = multiply($c, $b); echo $d; $a++; } |
非常に簡単な例ですが、参考にしてみて下さい。
20. 結合度を減らし、独立性を保つこと
結合度は1つのコンポーネントを変更した時に、どれだけのコンポーネントにどれだけ影響を与えるかということです。ある関数の内容を変更した場合、他の関数を変える必要があるかどうか、ということです。
独立性の高いコードを常に正しく追加しましょう。
悪い例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php // We want to add two numbers // only if the first number is // lower than 5 function add($iVar, $iVar2) { if ($iVar < 5) return false; else $iResult = $iVar+$iVar2; echo ""The Result is "", $iResult; } $iVar = 3; $iVar2 = 2; add($iVar, $iVar2); |
この例は、バリデーションを関数内に含んでいて、独立性が弱く、結合度が高くなっています。
結果の出力を関数内に置くこと自体が大きな問題です。
この関数を複数箇所で使っていた場合、テキストを変更すると、全ての箇所で変更を考慮する必要があります。
良い例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php // We want to add two numbers // only if the first number is // lower than 5 function addd($iVar, $iVar2) { return $iVar + $iVar2; } function result($sMessage) { return ""The Result is "" . $sMessage; } $iVar = 3; $iVar2 = 2; if ($iVar < 5) { echo result(add($iVar, $iVar2)); } |
こうすることで、addとresultの関数の独立性が高まり、色々な箇所で使用できるようになります。。
より良いPHPerにならないための20Tips
タグ(=記事関連ワード)
日付
最終更新日:2023年08月30日