PHPでウェブの世界と繋がろう!
menu
ホーム > PHPプログラミング心得 > よりよいコードを記述するために

よりよいコードを記述するために

Pocket

より良いPHPerになるための20Tips

POINT
 参照記事20 Tips you need to learn to become a better PHP Programmer
 記事を参考にしながら筆者なりの意見を書き入れてみました。良いコードというのは常に考える必要があると思います。また、良いコードの認識や記述方法などは、プログラマーのレベルに依存すると思いますので、賛成意見や反対意見を取り入れながら成長させていくことになるでしょう。

 初心者はまず、「良いコードとは?」ということを意識することが大切だと思います。意識して実践するにはコーディングの指針を決めることが良いと思います。指針は常に変更して改善させることになると思います。

 以下は、コードを記述する際の一つの指針になると思います。初心者にとっては以下のことを考え実践していくことは非常に大切なことだと思います。一度試して見てください。その上で自分なりに様々な意見を取り入れ、改善し、よいコードを記述することを心がけていきましょう。

 また、良いコードを書くには良いコードを見ることが大切ですね。WordPressなどを参考にするのもいいと思います。

1. <?php と ?> を使う
 コードを記述する際、開始タグと終了タグは「<?php…?>」を使うようにしましょう。
「<?…?>」は他のサーバーで動かない可能性があります。

同様に、変数を echo するときもショートタグの使用を避けましょう。

「<?php…?>」を使えばポータブルなコードになります。

<? ... ?> //×
<?php ... ?> //○

<?=$Var?> //×
<?php echo $Var ?> //○

2. 設定ファイルを分離する
 スクリプト全体で使用するような設定値は設定ファイルを別に作ってそこに記述しましょう。
そして、設定ファイルはスクリプトの頭でインクルードしましょう。
こうしておけば、設定を書き換える必要が出てきても、設定ファイルの一部を書き換えるだけで済みます。
ファイルのインクルードはとても簡単です。

<?php
include("config.php");
// code goes here …
&#91;/PHP&#93;

※設定ファイルはドキュメントルート以外に設置するとセキュリティー上よいでしょう。
</div>


<a name="3"></a>
<h5>3. コメントは友達</h5>
<div id="txtBoxLms" class="txtM"> 自分で少し前に書いたコードが理解できなくなることがあります。
そんな時、コメントはそのときに考えていたことを思い出させてくれます。

[PHP ruler="true" toolbar="true"]
<?php
// Comment
# Comment
 
/* Paragraph Comment
Paragraph Comment
Paragraph Comment */
&#91;/PHP&#93;

※コードの正確な説明というよりは、そのコードは何を求めようとしているのかなどの目的を記述するのがいいのではないかと思います。
</div>



<a name="4"></a>
<h5>4. インデントとスペースを使う</h5>
<div id="txtBoxLms" class="txtM"> <strong class="clrPp6">正しくインデント</strong>されているコードは読みやすいのでインデントしましょう。

不適切にインデントされたコード。
[PHP ruler="true" toolbar="true"]
<?php
function  dothisformula($a,$b) { $c = $b+$a;
     $e=3;
while ($c < 20) {
$e = $e - 1; $c = $c + 1; }
     return $e; }
&#91;/PHP&#93;

適切にインデントされたコード。
&#91;PHP ruler="true" toolbar="true"&#93;
<?php
function dothisformula($a, $b) {
     $c = $b + $a;
     $e = 3;
     while ($c < 20) {
          $e = $e - 1;
          $c = $c + 1;
     }
     return $e;
}
&#91;/PHP&#93;
</div>





<a name="5"></a>
<h5>5. 変数名に意味を持たせる</h5>
<div id="txtBoxLms" class="txtM"> <strong class="clrPp6">変数名に意味を持たせる</strong>ことは大切なことです。名前を見てどのようなデータが入っているのか連想できる名前がいいでしょう。名前は長すぎてもだめですし、名前を決めるのに時間を掛けすぎてもだめです。ネーミングは慣れもあるので、常に意識して改善するように心掛けましょう。
また、良いコードを見て参考にするのがいいと思います。
データの型まで分かると更に良いでしょう。
例えば、integer型の変数には、変数名のプレフィックスとしてiをつける。
こうすれば意図しているデータ型も名前から判別できます。
変数に型宣言しないPHPにおいて、これは特に重要です。
[PHP ruler="true" toolbar="true"]
<?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
&#91;/PHP&#93;

※型付けの弱い言語であるPHPでは、上記のように変数名に型を判別できる名前を付与したとしても、実際に違う型のデータでも全く問題なく使用できます。変数名はデータ型を保障するものではありません。
</div>




<a name="6"></a>
<h5>6. 変数を初期化する</h5>
<div id="txtBoxLms" class="txtM"> PHPでは、変数に値を代入するたびに、<strong class="clrPp6">自動で変数を定義</strong>してくれます。
<strong class="clrPp6">変数を使う前に初期化するのは良い癖です。</strong>
変数を初期化すると警告が出なくなりますし、空の変数を使用するので汚染リスクが無くなり、セキュリティーが向上します。

[PHP ruler="true" toolbar="true"]
<?php
$sString = '';//文字列

$iInteger = 0;//整数

$bBoolean = false;//論理値
//Boolean is False, unless True

$aArray = array();//配列

$object = NULL;//オブジェクト
&#91;/PHP&#93;
</div>




<a name="7"></a>
<h5>7. 返り値は常に false を返す、true ではない限り</h5>
<div id="txtBoxLms" class="txtM"> 特定の「値」であるかを判定するコードを記述する場合、
<strong class="clrPp6">望む「値」以外は常に false を返す</strong>ように記述しましょう。

悪い例:
[PHP ruler="true" toolbar="true"]
<?php
function getStatus() {
    $bReturn = true;
    if ($i != 2) $bReturn = false;
    return $bReturn;
}
&#91;/PHP&#93;

良い例:
&#91;PHP ruler="true" toolbar="true"&#93;
<?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;
}
&#91;/PHP&#93;

2番目の例は、あなたの書いた if文 が間違っている場合には有効です。
正しいデータが入力されるまでは、動かないコードを書くべきです。
</div>




<a name="8"></a>
<h5>8. 連想配列のキーにアクセスする場合はクォートで囲う</h5>
<div id="txtBoxLms" class="txtM"> 連想配列にアクセスする場合、以下のどちらのコードでもPHPは動きます。
[PHP ruler="true" toolbar="true"]
<?php
$sName = $aNames&#91;'marc'&#93;;
$sName = $aNames&#91;marc&#93;;
&#91;/PHP&#93;
2つ目のコードは、PHPはまず始めに、 marc と名付けられた定数を探しに行き、もし存在すればその値に置き換えます。
連想配列のキーにアクセスする場合はクォートで囲うようにしましょう。
</div>




<a name="9"></a>
<h5>9. echo するときに「,(コンマ)」を使う</h5>
<div id="txtBoxLms" class="txtM"> 文字列を変数の値と一緒に出力する場合、PHPでは「.(ドット)」の代わりに「,(コンマ)」を使う方がいいです。
なぜなら、「.(ドット)」を使うよりも僅かに速くなるからです。(以下のコードでテストした場合)。

カンマ
[PHP ruler="true" toolbar="true"]
<?php
echo "Hello, my name is ", $sName;
&#91;/PHP&#93;

ドット
&#91;PHP ruler="true" toolbar="true"&#93;
<?php
echo "Hello, my name is " . $sName;
&#91;/PHP&#93;
</div>





<a name="10"></a>
<h5>10. 三項演算子を使う</h5>
<div id="txtBoxLms" class="txtM"> シンプルなif文を書きたい場合は、<strong class="clrPp6">三項演算子</strong>を使えば1行で通常のif文を書くのと同じことが書けます。

通常のif文
[PHP ruler="true" toolbar="true"]
<?php
if ($a == 1) $b = 2;
else $b = 3;
&#91;/PHP&#93;

三項演算子を使用した場合
&#91;PHP ruler="true" toolbar="true"&#93;
<?php
$b = ($a == 1) ? 2 : 3;
&#91;/PHP&#93;

三項演算子は下記のように使用されます。
&#91;PHP ruler="true" toolbar="true"&#93;
<?php
$variable = (CONDITION) ? IFTRUE : IFFALSE;
Use === for Boolean Checks
&#91;/PHP&#93;
</div>



<a name="11"></a>
<h5>11. 真偽値の判定には「===」を使う</h5>
<div id="txtBoxLms" class="txtM"> <strong class="clrPp6">「===」を使用すると「値」の判定と共に「型」の判定も行われます。</strong>変数が true か false かを正確に判定するために、「==」よりも「===」を使うほうが良いでしょう。

[PHP ruler="true" toolbar="true"]
1 <?php
2 if ($bIsMember == true) { ... } // Incorrect
3 if ($bIsMember === true) { ... } // Correct
4 Use ++ and — Operators
&#91;/PHP&#93;
</div>





<a name="12"></a>
<h5>12. ++ と -– の演算子を使う</h5>
<div id="txtBoxLms" class="txtM"> 整数を「減少」「増加」させる場合は、<strong class="clrPp6">「++(インクリメント)」</strong>、あるいは<strong class="clrPp6">「--(デクリメント)」</strong>の演算子を使用しましょう。

悪い例:
[PHP ruler="true" toolbar="true"]
<?php
$iNumber = $iNumber  + 1;
$iNumber2 = $iNumber2 - 1;
&#91;/PHP&#93;

良い例:
&#91;PHP ruler="true" toolbar="true"&#93;
<?php
$iNumber++;
$iNumber2--;
&#91;/PHP&#93;

 この演算子の優れているところは、他演算の実行中でも使えることです。(例えば、if文とかwhile文)。
++や-–の演算子は、変数の前に置くか、後に置くかで、動作が異なります。
前に置けば、その動作が完了する前に、後に置けば、その動作が完了した後にインクリメント、あるいはデクリメントが実行されます。

以下の例を参考にしてみてください。
&#91;PHP ruler="true" toolbar="true"&#93;
<?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。
&#91;/PHP&#93;
</div>




<a name="13"></a>
<h5>13. 代入演算子を使う</h5>
<div id="txtBoxLms" class="txtM"> 2以上の数値をインクリメントあるいは、デクリメントしたい場合は、<strong class="clrPp6">代入演算子</strong>を利用しましょう。

悪い例
[PHP ruler="true" toolbar="true"]
<?php
$a = $a + $b;
$a = $a * 5;
$a = $a - $d;
$a = $a / 3;
&#91;/PHP&#93;

良い例:
&#91;PHP ruler="true" toolbar="true"&#93;
<?php
$a += $b;
$a *= 5;
$a -= $d;
$a /= 3;
&#91;/PHP&#93;

文字列にも使用できます。
&#91;PHP ruler="true" toolbar="true"&#93;
<?php
$sString = $sString . "hello";
$sString .= "hello";
&#91;/PHP&#93;
</div>




<a name="14"></a>
<h5>14. 変数のdump関数を作る</h5>
<div id="txtBoxLms" class="txtM"> コーディング中に変数の値を確認することはよくあります。その際 print_r や var_dump などを使用すると思います。
さらに簡単にするために、次のような関数を作っておきましょう。変数の確認が迅速に簡単にできるようになります。

[PHP ruler="true" toolbar="true"]
<?php
function P($var) {
    echo '<div align="left" style="background-color:white;color:black;">[PHP ruler="true" toolbar="true"]';
    print_r($var);
    echo '</pree></div>';
}

15. 定数を使う
 値が変更されない変数を使っているのであれば、定数化しましょう。
頻繁にアクセスするような、例えばディレクトリパスやエラーメッセージなどです。
定数名には、全て大文字を使うことが慣例になっています。

<?php
define ("DIRECTORY","/path/to/site/");
echo DIRECTORY;
&#91;/PHP&#93;
</div>




<a name="16"></a>
<h5>16. $_GET と $_POST を使う</h5>
<div id="txtBoxLms" class="txtM"> $_REQUEST は使用しないで、URLからGETパラメータが欲しいときは $_GET を、フォームからPOSTパラメータが欲しいときは、 $_POST を使用しましょう。また、 $_GET や $_POST は直接使用せずに意図するデータになるようにフィルタリングしましょう。

[PHP ruler="true" toolbar="true"]
<?php
$sAction = '';
if($_GET&#91;'actions'&#93; == 'actions')
$sAction = $_GET&#91;'actions'&#93;;

$sName = '';
if($_POST&#91;'actions'&#93; == 'actions')
$sName = $_POST&#91;'actions'&#93;;
&#91;/PHP&#93;

※フィルタリングはセキュリティー上非常に重要です。フォームから入力されたデータ等、外部からのデータはすべてフィルタリングするようにしましょう。
&#91;PHP ruler="true" toolbar="true"&#93;
//安全な変数
$sName = 'tryphp'; 

//汚染リスクのある変数
$sName = $_POST&#91;'tryphp'&#93;; 
&#91;/PHP&#93;

</div>




<a name="17"></a>
<h5>17. 関数の代わりにオブジェクトを使う</h5>
<div id="txtBoxLms" class="txtM"> 関数に多くの引数が設定されている場合、オブジェクトに切り替えた方が良いでしょう。

[PHP ruler="true" toolbar="true"]
<?php
function getProducts($iParameter1, $iParameter2,
$iParameter3, $iParameter4, $iParameter5,
$iParameter6, $iParameter7, $iParameter8,
$iParameter9) { ... }
&#91;/PHP&#93;

こうすることが出来ます。
&#91;PHP ruler="true" toolbar="true"&#93;
<?php
$oProducts->setParameter1(...);
$oProducts->setParameter3(...);
$oProducts->setParameter5(...);
$oProducts->setParameter6(...);
$oProducts->getProducts();

※あまり変わらないような気もします。多すぎる引数が設定されている場合は設計を考えてみましょう。どのような場合にオブジェクトが有効なのかみなさんも自分なりに考えて見てください。

関数の引数が多い場合は連想配列にまとめてから関数の引数として渡すのがよいと思います。

<?php
$aParameter = array(
                   'iParameter1' => $iParameter1,
                   'iParameter2' => $iParameter2,
                   'iParameter3' => $iParameter3,
                   'iParameter4' => $iParameter4,
                   'iParameter5' => $iParameter5
                   );
function getProducts($aParameter) { ... }

18. メソッドチェインを使う
 複数回オブジェクトのメソッドを呼び出し、変数にセットしている場合、メソッドチェインを使うことで、コードをよりシンプルに出来きます。メソッドチェインの方法は、各メソッドにおいて返り値に$thisをセットすることで利用できます。

次のコードは、

<?php
class User {
 
    function setThis($iVar) {
        ....
        return $this;
    }
 
    function setThis2($iVar2) {
        ....
        return $this;
    }
 
}
&#91;/PHP&#93;

下記のようにメソッドチェインに書き換えることが出来ます。
&#91;PHP ruler="true" toolbar="true"&#93;
<?php
$oUser = new User();
$oUser->setThis(...)
      ->setThis2();

19. コードの繰り返しを止めよう
 コードが繰り返されているならば、重複しているコードを関数かオブジェクトに置き換えましょう。
この作業はとても面倒ですが、アプリケーションが大きくなればなるほど、その対価を支払う価値があります。


20. 結合度を減らし、独立性を保つこと
 関数には明確に責任と目的を持たせましょう。引数、処理、出力、を明確にするようにしましょう。そうすれば独立性が高くなります。
結合度は1つのコンポーネントを変更した時に、どれだけのコンポーネントにどれだけ影響を与えるかということです。ある関数の内容を変更した場合、他の関数を変える必要があるかどうか、ということです。

独立性の高いコードを常に正しく追加しましょう。

悪い例:


より良いPHPerにならないための20Tips
 上記内容を把握したところでこんな意見もあります。
より良いPHPerにならないための20Tips
まずは上記を読んで理解した上で反対意見も考えてみてください。

タグ(=記事関連ワード)

タグ: , ,

日付

投稿日:2011年10月3日
最終更新日:2012年02月28日

関連記事

このカテゴリの他のページ

この記事へのコメント

トラックバックurl

http://www.tryphp.net/bettercode/trackback/