PHPのコードを少し最適化する


PHPは開発スピードが早いのはいいが、記述に一貫性がないので、コードが見辛くなりがちなので、ある程度の体裁は整えるべきだと思う。

スクリプト言語なので容易に継ぎ足し出来る反面、追記していくたびにコードが汚くなっていく。

また、定義が曖昧な関数が多いのと、膨大なリソースサンプルがあるので、それらをそのまま複製していくとえらいこっちゃになることが多々ある。

この記事ではある程度コードを最適化するときの注意点をメモしておく。

 

「@」のエラー制御は使わない

@マークの処理は相当遅い。

さらに付け加えてエラーの判別が出来ないので、下手に値が返ってしまっている時に結果の整合性が悪くなる。

個人的にはNOTICEエラーまで出してもいいくらいだと思う。

 

配列は $array[id] じゃなく $array[‘id’] と記述する

これは処理速度が単純にシングルクォーテーションをつけたほうが早くなる。

キーに文字列を指定している場合や、MySQLやPostgreSQLなどから値を取得した際の配列もシングルクォーテーションをつけることでコードも見やすくなる

 

既存の関数をうまく使う。

よくあるのがarray_searchとin_array関数

in_arrayの方が高速だが、array_searchは返り値に配列キーを返してくれるので、帰ってきたキーで処理を行いたい時には有用に使えるはず

[php]

<?php

$array = (‘あほ’, ‘ばか’, ‘カス’);

if (in_array(‘あほ’, $array) === TRUE) {

echo "あほが見つかりました";

}

?>

[/php]

間違っても配列の回数分for文でループするといった暴挙はやめよう(必要な場合もあるが)

 

if文は「===」で行う

これもよく書かれていること

例えば0と0.0がTRUEで扱われてしまうという問題

すべての比較を「===」で行う必要はないが、若干こっちのほうが高速らしいので、できるだけ「===」を使用したほうがいいみたい。

 

forよりforeachの方が高速・・・らしい

foreachの方がfor文よりも高速みたいだが、for文の方が応用が効くので、ここはあえて処理を変える必要もないと思う。

ただ、配列すべての値を返すときなどはできるだけforeachを使用したほうが、コードも見やすくなる

よくあるのが、メールフォームのエラーチェックなどで値を全部返したい時

[php]

<?php

foreach ($_POST as $key => $val) {

echo "<input type=\"hidden\" name=\"" .$key. "\" value=\"" .$val. "\">";

}

?>

[/php]

単純なループはforeachを使う方がいいし、無限ループの可能性も抑えられる。

熱烈なforeachファンもいるようだが・・・・。

 

変数は基本初期化してから使用する

使用する変数はそれぞれ最初に初期化しておくのがbetter

特にループ内での初期化は極力しておいたほうがいい。

また、初期化する際にはそれぞれ使用用途に合わせて下記の用に初期化するとわかりやすいと思う。

[php]

$string = ”;   // 文字列

$integer = 0;    // 数値

$object = NULL;    // オブジェクト

$flg = FALSE;    // フラグ

$array = array();    // 配列

[/php]

間違っても数値として扱っていた変数に文字列を入れるような浮気なコードは書かないこと。

 

elseifが多発するようならswitch文を使う。

elseifは各条件を比較するのに対し、switchはその条件分岐の場所まで飛ぶので、比較的高速。

また、コードも見やすくなるので、あまりにも連続しすぎるelseifがある場合はswitch文に置き換えよう。

 

最後に

Zendのコーディング規定を読んで自分なりに整えればいいと思う。

http://framework.zend.com/manual/1.12/ja/coding-standard.coding-style.html

決してすべてこのとおりにコーディングする必要はないが、あまりにも自分のコードがひどいと感じたら少しでも合わせるようにすると後から自分のソースを見る人にも親切だろう。

Pythonみたいに上品なコードには到底及ばないが、各個人が体裁を整えればまだPHPはクソだなんて言われないだろうな。

少なくともインデントくらいはしてくれ・・・w


この投稿へのコメント

コメントはありません。

コメントを残す

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL