« Firefox 2.0に移行する際のお勧め設定(中級編) | メイン | 携帯サイト作成時の注意点(SoftBank編) »

PHPのちょっとしたコツ
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

Keitaです。

個人的には、Pythonの思想を取り入れた JavaScript 1.7 がとても気になっているのですが、それは明日の Keita(個々一番さん)が説明してくれると思うので楽しみに待つことにしましょう☆
ウノウの社員は、スルー力も必要なようです。

さて、そんな世迷言はみなかったことにして、PHPの話題です。
PHPいいよ、PHP素敵だよ。

さて、今回は日ごろ気をつけているPHPのコーディングのコツをTIPS形式で書いていこうと思います。

しかし、はるか過去にいろいろな所で情報収集したので情報の出典を忘れてしまいました。
わかる限りはURLを記載していきますが、記載されてない所があったらすいません&コメントで補足いただけると助かります。

1. array_pushは遅い
いくつかのBlogで語られてることですが、array_pushは、次のような書き方のほうが早いそうです。

	//array_puth($array, 'arraydata');
	$array[] = 'arraydata';

PHPをいじってきた感想でいうと、全体的に組み込み系の関数の類を使うよりは、PHPの構文として定義されているものを利用するほうが早いことが多いです。

2. array_key_existsよりハッシュを使え
array_searchは、毎回全データを検索するので遅いです。
データに配列の順序が関係ないなら、連想配列 + issetを使うほうが高速です。
連想配列の場合ハッシュの仕組みが使われるのでその分高速です。
同様に、array_key_existsよりissetのほうがはるかに高速です。


//$array[] = 'arraydata';
//if (array_search('arraydata', $array)) {
// echo 'あるよ。';
//}

$array['arraydata'] = 'arraydata';
if (isset($array['arraydata'])}
echo 'あるよ。';
}


上の2つの、array関係は、多数の値がある場合に結構変わってきます。

※情報が不正確でしたこちらの記事を参照ください


3. $_ほげほげは直接使わない
これは心得の問題です。
$_GETや、$_POSTなどの値は直接使わないようにしましょう。
特に$_SERVERには、外部から送られてくる値を直接格納している場合がありますのでこれを直接使うとひどい目にあいます。
一般的なフレームワークなら、これらをラッピングする関数などが準備されているハズですのでこれを使いましょう。

4. if文は「===」を使う
PHP勉強会で、Dinoのhnwさんに教わったことですが、'0.00' == '0'は真です。
もし、仮に、パスワード処理でデータ側でMD5などのハッシュ化してない場合に、上記が真になっては非常にまずいのではないでしょうか。
さらにいえば、もっといろいろな形で、真となる場合があるので「==」は使わず、「===」を使いましょう。

    if ($str === 'hoge') {
    if (! ($str === 'hoge')) {
    if (is_null($null) === false) {
5. countは配列数を毎回数えてる これを知ったのは、Pukiwkiのクリーンアップの記事を見たときなのですが。 countは配列の件数を数えるらしいので次のような書き方に直したほうが無難です。
    // if(count($array))
   if(! empty($array))
   // for($i = 0; $i < count($array); $i++)
   $count = count($array);
   for($i = 0; $i  < $count; $i++)
※毎回数えてるわけではないらしい。 お詫びして訂正します。

まぁ、基本的に、ZendFrameworkや、Pearのコーディング規約でことたりるような気もします。

トラックバック

このエントリーのトラックバックURL:
http://www.unoh.net/mt32/mt-tb.cgi/379

この一覧は、次のエントリーを参照しています: PHPのちょっとしたコツ:

» [PHP]PHPのイテレーションの話とか from odz buffer
ウノウラボ Unoh Labs: PHPのちょっとしたコツ 一時期PHPで飯を食っていた身*1として、軽く突っ込みを。 4. if文は「===」を使う ... [詳しくはこちら]

» [PHP] mb_ereg()じゃない、preg_match_all()に/uをつけるんだ! from Information Flow and Stock
ウノウラボ Unoh Labs: PHPのちょっとしたコツ 最近のスクリプト言語は機能が多く基本的な機能はほとんど実装されているので、アルゴリズムをど... [詳しくはこちら]

» [PHP]isset と array_key_exists from odz buffer
昨日の続き。 2. array_key_existsよりハッシュを使え array_searchは、毎回全データを検索するので遅いです。 データに配列の... [詳しくはこちら]

コメント

最後のループの部分、不等号が逆になっていませんか?

おぉ本当だ、修正しておきました。
ありがとうございます。

array_key_searchではなくarray_key_existsでは?

だ、だめだ俺。
直しておきました。

補足。
PHPのソースコードを見る限り、count では計数するようなことはしてないです。
変数の型を調べて、構造体のメンバを返しているだけなので、COUNT_RECURSIVE を指定しない限りは常に定数時間で終わるかと思います。

>odzさん
そのようですね。
先ほど教えていただいたのですが、
https://www.codeblog.org/blog/moriyoshi/20060824.html
によるとnNumOfElementsを見てるようです。

「パスワード処理でデータ側でMD5などのハッシュ化してない場合に、上記が真になっては非常にまずいのではないでしょうか。」MD5にしてもまずいです。
http://pukiwiki.sourceforge.jp/dev/?BugTrack%2F608

>henohenoさん
言葉がたりなかったですね。
md5でチェックする場合は、一般、MD5同士のチェックになると思います。
'fgdjdkdf...' == md5('0');

上記の意味で、まるっきり危険じゃないよねという意味で捉えていただければ幸いです。

上記を含めて===にしたほうがいいのは確かです。

array_key_existsは値がNULLであってもキーの存在有無で真偽を返しますが、
isset()は値がNULLの場合は偽を返しますので、その構文は危険です。

>taka0024さん
確かにその通りですね。
この状況については認識していたのですが、(自分が)使用していた状況でNULLが存在しないものだったので失念していました。
ありがとうございます。

array_puth?

誤字ですかな??

コメントを投稿


画像の中に見える文字を入力してください。