ホーム > PHP > より良いPHPerになるための20Tips

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

Write clearly php code

去年の話ですが、海外でこんな記事が上がっていました。

記事の内容は、かなりレベルが低いです。
しかし、初心者のうちに知っておけば、より早く成長出来るでしょう

初心者PHPerのために、この記事の翻訳を載せます。

2011年03月21日 追記

この記事の補足が、他の方によって書かれています。
この記事に対する自分の意見を、先に載せておくべきだったかも。
実は色々と痛い目を見ると、この下の記事の悪いところと、上記記事の良いところがわかります
だけど、初めはわからないんですよね…。

20 Tips you need to learn to become a better PHP Programmer

PHPは、同じオブジェクトの扱い方でも複数の書き方を持っている、とても気まぐれなプログラミング言語だ。
詳しくは、私の書いた”The Art of Programming“を読むと良い。
これから書くTipsは、過去のプロジェクトから私が学んだコードの可読性、メンテナンス性を上げ、あなたを素晴らしい、より進んだPHPプログラマーにするものだ。

それじゃ、始めよう。

1. <?phpと?>を使え

スクリプトを書くにあたり、<?と?>を使うのを忘れること。
これらを使ったスクリプトがあなたのサーバで動いたとしても、他のサーバで動かないかもしれない。

同様に、変数をechoするときもショートタグを使うのを止めるんだ。
慣れた人がこれを使うのを止めるのは、正直、難しい。
けど、止めることで最終的にポータブルなコードが書けるんだ。

<? ... ?> // Incorrect
<?php ... ?> // Correct
<?=$Var?> // Incorrect
<?php echo $Var ?> // Correct

2. 設定ファイルを分離せよ

あなたのスクリプトファイルに設定値が追加すべきであるということは、言うまでもないよね。
あなたはいつでも、設定ファイルを分離して、スクリプトの頭でインクルードすべきだ。
こうしておけば、設定を書き換える必要が出てきても、設定ファイルの一部を書き換えるだけで良い。
ファイルのインクルードはとても簡単だ。

<?php
include("config.php");

// code goes here ...

3. コメントは君の友達

そう、あなたはこんな状況に遭遇したことがあるんじゃ?
私たちが少し前に書いたコードを理解出来なくなるのは、本当に驚くべきことだ。
コメントは、そのときに考えていたことを思い出させてくれる。
シンタックスはこう。

<?php
// Line One Comment
// Line Two Comment

/** Paragraph Comment
Paragraph Comment
Paragraph Comment **/

簡単でしょ?

4. インデントとスペースを使え

まったく正しくインデントされていない、誰が書いたかわからないコードを変更することほど、最低なことはないね。
正しくインデントされたコードは、あなたがプログラマーだってことを示している。
理想的なコードは、ループがそこで終わりだか、終わりでないんだか、が一目で分かるんだ。
これは、不適切にインデントされたコードだ。

<?php
function  dothisformula($a,$b) { $c = $b+$a;
     $e=3;
while ($c < 20) {
$e = $e - 1; $c = $c + 1; }
     return $e; }

そして、こっちが正しいコード。

<?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において、これは特に重要だ。

変数名の頭文字を大文字にするかどうかは、あなた次第だ。
しかし、読み易さから言っても、単語の先頭は大文字にすることをお勧めする。

こんな感じだ。

<?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

6. 変数を初期化せよ

PHPでは、変数に値を代入するたびに、自動で変数を定義してくれる。
しかし、変数を使う前に初期化するのは、良い癖だ。
これをすることで、コードが明確になるし、変数の内容があなたの思い通りの値になる。

<?php
$aArray = array();
$iInteger = 0;
$bBoolean = false;
Boolean is False, unless True

7. 返り値は常にFalseに、Trueじゃない限りは

もし、あなたが特定の値であるか、どうかを判定するコードを書いたとする。
そのコード判定は望む値になった場合を除き、常にfalseを返すべきだ。
例えば、以下のようなコードは書かない方が良い。

<?php
function getStatus() {
    $bReturn = true;
    if ($i != 2) $bReturn = false;
    return $bReturn;
}

この代わりに、あなたはこう書くべきだ。

<?php
function getStatus() {
    $bReturn = false;
    if ($i == 2) $bReturn = true;
    return $bReturn;
}

二番目の例は、値をチェックする場合の理想的な方法だ。
なぜかって?あなたがデータベースから値を取り出すときを、想像してみて欲しい。
もし、何かしらの理由で、あなたの書いたif文が間違っていたら?
この書き方をしていれば、間違った値に対して、常にfalseが返る。
私たちが、PHPでsensitiveなデータを取り扱うなら、正しいデータが入力されるまでは、動かないコードを書くべきだ。
これは私の経験上、特にね。

最終的に、バリデーションとは、あなたのデータがあなたの思い描く通りであるか、それともそうでないかを判断するべきものだ。

8. 配列のキーにアクセスする場合はクオートで囲う

配列にアクセスする場合、以下のどちらのコードでもPHPでは動く。

<?php
$sName = $aNames['marc'];
$sName = $aNames[marc];

二つ目のコードは、PHPはまず始めに、marcと名付けられた定数を探しに行き、もし存在すればその値に置き換える。
そう、大抵の場合、これでも動く。
しかし、もし、同じ名前の定数が定義されていたら?
その場合、あなたのスクリプトは動作しなくなるんだ。

9. echoするときにはコンマを使え

もし、文字列を変数の値と一緒に出力するとき、PHPではドットの代わりにコンマを使うことが使える。
なぜ?ドットを使うよりも僅かに速いからね(以下のコードでテストした場合は)。

<?php
echo "Hello, my name is ", $sName;

以下の代わりに上記のコードを使う。

<?php
echo "Hello, my name is " . $sName;

10. 三項演算子を使え

もし、シンプルなif文を書きたいなら、三項演算子を使って、ワンラインで通常のif文を書くのと同じことが書ける。

<?php
if ($a == 1) $b = 2;
else $b = 3;

上記のコードは、以下の三項演算子を使ったのと同じことだ。

<?php
$b = ($a == 1) ? 2 : 3;

簡単でしょ?三項演算子は、以下のようによく使われるね。

<?php
$variable = (CONDITION) ? IFTRUE : IFFALSE;
Use === for Boolean Checks

11. 真偽値のチェックには===を使え

もし、あなたが変数がtrueかfalseか、チェックしなければ行けない場合、==よりも===を使おう。
この三つ連なるイコールは、PHPに値のチェックと同時に、タイプのチェックまでさせる。

<?php
if ($bIsMember == true) { ... } // Incorrect
if ($bIsMember === true) { ... } // Correct
Use ++ and — Operators

12. ++と–の演算子を使え

整数を減少あるいは増加させる場合、インクリメントあるいはデクリメントの演算子が使える。
もし、あなたがこんなコードを書いているなら、

<?php
$iNumber = $iNumber  + 1;
$iNumber2 = $iNumber2 - 1;

こう変換すべきだ。

<?php
$iNumber++;
$iNumber2--;

この演算子の優れているところは、他演算の実行中にも使えることだ(例えば、ifとかwhileのステートメントだ)。
++とか–の演算子は、変数の前に置くか、後に置くかで、動作が異なる。
前に置けば、その動作が完了する前に、後に置けば、その動作が完了した後にインクリメント、あるいはデクリメントが実行される。
以下の例は、あなたの、この演算子の理解を助けてくれるだろう。

<?php
$iNumber = 10;
while ($iNumber++ == 10) { ... }
// インクリメント演算子が、比較後に実行される。
//  つまり、このwhileの中は1度だけ実行される。

$iNumber = 10;
if (--$iNumber == 10) { ... }
// デクリメント演算子が、比較前に実行される。
// つまり、このwhileの中は1度も実行されない。 

$iNumber = 10;
$iTotal = $iNumber++;
// $iTotalは10だ。

$iNumber = 10;
$iTotal = --$iNumber;
// $iTotalは9だ。

13. 代入演算子を使え

もし、あなたが2以上の数値をインクリメントあるいは、デクリメントしたいとする。
その場合、代入演算子が便利だ。
もし、こんなコードがあったとしたら、

<?php
$a = $a + $b;
$a = $a * 5;
$a = $a - $d;
$a = $a / 3;

代入演算子を使って、次のように書き直せる。

<?php
$a += $b;
$a *= 5;
$a -= $d;
$a /= 3;

これは、もちろん文字列にも使える。次の二行のコードは同じ意味だ。

<?php
$sString = $sString . "hello";
$sString .= "hello";

14. 変数のdump関数を作れ

私たちは、テストをする上で変数の値を確認するためによく、print_rにはお世話になる。
これをさらに簡単にするために、次のような関数を作ろう。

<?php
function p($var) {
    echo "<pre>";
    print_r($var);
    echo "</pre>";
}

これはあなたの変数dumpを常に、読みやすいようにpreタグで括る物だ。
ついでに、関数名を一文字にすることで、使いやすくもなる。

15. 定数を使え

もし、変更されない変数を使ってるんだとしたら、それは書き直せる必要はないよね。
よくアクセスする、例えばディレクトリパスやエラーメッセージなどは、定数化しよう。
定数名には、全て大文字を使うことをお勧めする。
こうすることで、コード中でそれが定数であることが、わかりやすくなる。

<?php
define ("DIRECTORY","/path/to/site/");

echo DIRECTORY;

16. $_GETと$_POSTを使え

$_REQUEST変数のことは忘れよう。
URLからGETパラメータが欲しいときは$_GETを、フォームからPOSTパラメータが欲しいときは、$_POSTを使おう。

<?php
$sAction = $_GET['actions'];

$sName = $_POST['name'];

こうすることで外部のユーザは、URLを操作することによって、フォームの値を変更出来なくなる。

17. 関数の代わりにオブジェクトを使え

もし、たくさんの引数と共に関数を使っていたのなら、それはオブジェクトに移行するときが来たのだ。
私は、メンテナンスのしにくい、とても複雑な関数が定義されているプロジェクトで働いていたこともある。
そう、引数が20個もある関数がいくつか定義されているのだ。
こんなとき、あなたは変数の呼び出し方法を変更する必要があるだろう、それも全ての関数において。
この関数では、

<?php
function getProducts($iParameter1, $iParameter2,
$iParameter3, $iParameter4, $iParameter5,
$iParameter6, $iParameter7, $iParameter8,
 $iParameter9) { ... }

こう変更することが出来る。

<?php
$oProducts->setParameter1(...);
$oProducts->setParameter3(...);
$oProducts->setParameter5(...);
$oProducts->setParameter6(...);
$oProducts->getProducts();

18. メソッドチェインを使え

もし、あなたが複数回オブジェクトのメソッドを呼び出し、変数にセットするなら、メソッドチェインを使うことで、コードをシンプルに出来る。
メソッドチェインの方法は簡単で、各メソッドに返り値に$thisをセットするだけだ。
次のコードは、

<?php
class User {

    function setThis($iVar) {
        ....
        return $this;
    }

    function setThis2($iVar2) {
        ....
        return $this;
    }

}

次のようにメソッドチェインに書き換えることが出来る。

<?php
$oUser = new User();
$oUser->setThis(...)
      ->setThis2();

これであなたのコードは、より短く、より素晴らしくなるよ。

19. コードの繰り返しを止めよ

どんなコードも繰り返すな。もし、少しでも同じコードを書いていたなら、それは関数に置き換えてしまえ。
それか、オブジェクトに変えてしまえ。この作業は面倒かもしれない。
しかし、アプリケーションが大きくなればなるほど、その対価を支払う価値がある。
簡単な例は以下だ。

<?php
$a = 1;
while ($a < 10) {
    $b = $a * 10;
    $c = $b * 2;
    $d = $c * $b;
    echo $d;
    $a++;
}

これは、次のように書き換えれる。

<?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. 結合度を減らし、独立性を保て

結合度は一つのコンポーネントを変えたときに、どれだけのコンポーネントに影響を与えるか、ってことだ。
言い方を変えると、もしあなたがある関数を変えたとして、他の関数を変える必要があるかどうか、ということ。
結合度を下げること、それはつまり、他に影響を与えないようにコンポーネントを変更することだ。
一方で、独立性はそれぞれを意味のあるユニットに分けることだ。
あなたのメイン関数は、全てのことを担ってる?
それとも、たくさんの特定の仕事をする関数から出来てる?
もし、そうなら、強い独立性を持っていることになる。強い独立性を持つと、その関数の責任が明確になり、その関数が自分に関係ない処理を行う場合に、他の関数を呼び出すようになる。

PHPプログラマの諸君は、コンポーネントを定義する場合、アプリケーションのメンテナンスを楽に、そして拡張性を高めるために、結合度を弱くし、独立性を強くするように気をつけるべきだ。
例え、関数を一つ作るだけであっても、このことは心に留めておくべきだ。
独立性の高いコードを常に正しく追加しよう。
そうすれば、あなたがシステムの一部を変更する場合に、他の部分を変更しなくても良くなるんだ。

こんなコードがあったとしよう(もちろん、これはシンプルな例だが)

<?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);

この例は、バリデーションを関数内に含んでいることで、独立性が弱く、結合度が高くなってしまっている。
結果の出力を関数内に置くことは、それ自体大きな問題だ。
もし、この関数を複数箇所で使っていたとして、テキストを変更したい場合に、全ての箇所の変更を考慮しなければいけないのだから。

もっと良いのは次のコードだ。

<?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の関数をコードの至る所で使うことが出来る。
そして、他のコードを気にすることなく、各関数を変更することが出来るんだ。

最後に

このTipsは分かりやすく、短く、そしてよりまとまったコードを書くのを助けてくれる。
これらの例はとてもシンプルだが、それぞれのコンセプトを理解するのに役立つものだ。
もし、あなたがこれらの一つにでも同意出来ないなら、ブログにコメントを。
私たちはそこからさらに、学べる。

おまけ

もし、あなたがPHPプログラマなら、公式のPHPドキュメントはあなたのバイブルだ。
私は、それぞれのセクションを眺めて、各関数でどんなことが出来るのか確認することをお勧めする。
あなたは、PHPで用意された既製関数で多くのことが実現できることに、驚くはずだ。

この記事があなたの役に立つことを。
どんなコメントでも待ってます。
ありがとう!

個人的な感想

この記事に書かれている内容は、レベルがかなり低いです。
例えば、”4. インデントとスペースを使え”。
これはプログラマとしては、当たり前のことです。

しかし、ここに書かれている大半のことは、多くの初心者PHPerが迷うことでもあります。
記事の途中でもありますが、PHPは”多くの書き方が出来る気まぐれな言語“です。
だからこそ、これらのことを知らずに、何となくプログラムが書けるようになったとき、そこで満足してしまい、良いコードが書けなくなるのでしょう。

私自身、PHPを始めたときに、この記事を知っていればもっと早く良いコードが書けるようになったのでは、と思います。

初心者PHPerの皆さんは、この記事を足がかりに、コードを洗練させていってください
(個人的なおまけ: より良いコードを書くには、より良い人のコードを読むことが大事ですよ!)

ちょっと一言

今回の震災で、エンジニアとして何も出来ませんでした。
しかし、他のエンジニアの方々はすごいですね。
ゼロから、一瞬で役立つものを創り上げる。
その行動力を、見習わなくては...。

  • http://omniaprice.com/uncategorized/%e3%82%88%e3%82%8a%e8%89%af%e3%81%84phper%e3%81%ab%e3%81%aa%e3%82%8b%e3%81%9f%e3%82%81%e3%81%ae20tips-453/ より良いPHPerになるための20Tips | For Omina Quries

    [...] Visit link: より良いPHPerになるための20Tips This entry was posted in Uncategorized and tagged php. Bookmark the permalink. ← Acordar antes do meio dia no domingo é a maior prova de que o sábado a noite foi uma merda. Leaked: Mic [...]

  • http://daizis.com/wp/?p=8 2011-03-20 | WordPressまとめ記事

    [...] より良いPHPerになるための20Tips http://1-byte.jp/2011/03/20/20_tips_you_need_to_learn_to_become_a_better_php_programmer/ 19:58 via Google2Tweet [...]

  • http://anond.pha11.info/archives/7242 より良いPHPerにならないための20Tips(1) – 増田まとめ
  • http://blog.is0.me/archives/612 The Some Times » Log » PHPerの面白そうなTips

    [...] PHPのコーディングについて、面白そうな記事が2つ。 より良いPHPerになるための20Tips (http://1-byte.jp/2011/03/20/20_tips_you_need_to_learn_to_become_a_better_php_programmer/) [...]

  • http://giskor.sub.jp/note/228 >> PHP基礎文法最速マスター | Shin x blog http://ww… « a giskor sophiohelix

    [...] >> より良いPHPerになるための20Tips http://1-byte.jp/2011/03/20/20_tips_you_need_to_learn_to_become_a_better_php_programmer/ [...]

  • http://psfactory.info/wp/?p=189 3月21日のおすすめ記事

    [...] ■ より良いPHPerになるための20Tips [...]

  • http://nt-log.com/archives/584 N. » Blog Archive » Weekly Twitter Log (2011/3/22 – 3/26)

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

  • http://giskor.sub.jp/note/357 >> G・パスカル・ザカリー 著 山岡 洋一 翻訳 /『闘うプログラマー 新装版 ビル・ゲイツの野望を担った男達』(Show… « a giskor sophiohelix

    [...] >> より良いPHPerになるための20Tips http://1-byte.jp/2011/03/20/20_tips_you_need_to_learn_to_become_a_better_php_programmer/ ◆ JavaScript ◆ [...]

  • http://mag-world.net/weekly-tune/?p=92 週刊Tune » 効率のよいPHPを書くために

    [...] 5月 21st, 2011 コメントする | トラックバック 「より良いPHPerになるための20Tips」が 面白かったので、抜粋して、覚書にしておきます。 [...]

  • http://uno-maniacs.net/2011/06/17/collect/hyena_otsu_part1/ ユウノマニアックス

    [...] -jFormer | コリス coliss.com より良いPHPerになるための20Tips 1-byte.jp CSS:初心者の頃にハマったスタイルシートのあれこれ … IE7多め [...]

blog comments powered by Disqus

ホーム > PHP > より良いPHPerになるための20Tips

スポンサードリンク
書いている人
つぶやき
RSS 気になるニュース
過去の記事

ページの上部に戻る