suin.io

もっとより良いPHPerになるためのTips

suin2011年3月20日

PHPに限らず、プログラムには書き手やプロジェクトによって流儀は様々なのは最初に述べておくとして、より良いPHPerになるための20Tips(英語原典20 Tips you need to learn to become a better PHP Programmer | webgeekly.com)に自分なりの補足をしたいと思う。

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

これは自分は真反対。というより、変数名に意味を持たせることは非常に同意するけど、ハンガリアン記法について反対ということ。「PHPは型がゆるい言語だからハンガリアン記法で型を宣言しよう」っていう主張は前からあるけど、型がゆるい言語だからこそハンガリアン記法は避けるべきだと思う。これが1つ目の理由です。

$sTags = 'php,perl,ruby,python';
$sTags = explode(',', $sTags);

例えば、カンマで区切られた文字列をexplodeで配列に分解したら、あっというまに型が変わってしまう。ここでもうハンガリアン記法は意味のないものになってしまう。それなら、配列用に別の変数名をつければいいじゃないかという反論があるかもしれない。しかし、それは一方で無駄な一時変数を増やすことでもある。

もうひとつの理由は、ハンガリアン記法は必ずしもプログラマ同士で共通化されていないという点。ハンガリアン記法自体、いくつかの流儀があって流儀が異なる者同士が同じコードを触った際に混乱につながる。混乱させるような記法なら最初から避けるべきだと思う。

私が思うに、「変数名に意味を持たせよ」で重要なことは、つきつめれば次の1点だと思う。

  • 変数名を略しすぎず、できるだけ発音できるものにする。

具体的に言えば、$categoryを$ctgと略したりしないということです。

10. 三項演算子を使え

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

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

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

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

「三項演算子を使え」は言い過ぎだと思う。せいぜい、「読みやすいコードになる場合に限ってのみ三項演算子を使ったほうがいい」だと考える。現に三項演算子は重ねて書かれると読みにくいし、ブレースがないぶん制御構造としての認識が低くなる。さらに言えば、単体テストのときにテストケースへの意識も低くなりかねないという危険性がある。上の例のようなコードでは、三項演算子が歓迎されると思う。しかし、三項演算子の乱用は控えるべきだとも思う。

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

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

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

こう変換すべきだ。

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

もっとより良いPHPerならこうすると思う。++より、+= 1を使う。

$iNumber  += 1;
$iNumber2 -= 1;

なぜなら、万が一 $iNumber に 'a' が代入されていたら、どうなるだろうか?その際の動作は、期待したものだろうか?

$iNumber = 'a';
$iNumber ++;
var_dump($iNumber); // string(1) "b"

もちろん$iNumberは、整数型にキャストする、ないしはバリデーションしておくべきだ。それでも、ちょっと工夫するだけで防衛プログラミングができるならそれに越したことはないと思う。

RELATED POSTS