PHPのちょっとしたコツ
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) {
// if(count($array))
if(! empty($array))
// for($i = 0; $i < count($array); $i++)
$count = count($array);
for($i = 0; $i < $count; $i++)
まぁ、基本的に、ZendFrameworkや、Pearのコーディング規約でことたりるような気もします。

コメント
最後のループの部分、不等号が逆になっていませんか?
投稿者: odz | 2006年10月27日 13:59
おぉ本当だ、修正しておきました。
ありがとうございます。
投稿者: Keita | 2006年10月27日 14:22
array_key_searchではなくarray_key_existsでは?
投稿者: hiro_y | 2006年10月27日 14:50
だ、だめだ俺。
直しておきました。
投稿者: Keita | 2006年10月27日 15:04
補足。
PHPのソースコードを見る限り、count では計数するようなことはしてないです。
変数の型を調べて、構造体のメンバを返しているだけなので、COUNT_RECURSIVE を指定しない限りは常に定数時間で終わるかと思います。
投稿者: odz | 2006年10月27日 15:50
>odzさん
そのようですね。
先ほど教えていただいたのですが、
https://www.codeblog.org/blog/moriyoshi/20060824.html
によるとnNumOfElementsを見てるようです。
投稿者: Keita | 2006年10月27日 16:10
「パスワード処理でデータ側でMD5などのハッシュ化してない場合に、上記が真になっては非常にまずいのではないでしょうか。」MD5にしてもまずいです。
http://pukiwiki.sourceforge.jp/dev/?BugTrack%2F608
投稿者: henoheno | 2006年10月30日 23:49
>henohenoさん
言葉がたりなかったですね。
md5でチェックする場合は、一般、MD5同士のチェックになると思います。
'fgdjdkdf...' == md5('0');
上記の意味で、まるっきり危険じゃないよねという意味で捉えていただければ幸いです。
上記を含めて===にしたほうがいいのは確かです。
投稿者: keita | 2006年10月31日 10:18
array_key_existsは値がNULLであってもキーの存在有無で真偽を返しますが、
isset()は値がNULLの場合は偽を返しますので、その構文は危険です。
投稿者: taka0024 | 2006年11月10日 13:41
>taka0024さん
確かにその通りですね。
この状況については認識していたのですが、(自分が)使用していた状況でNULLが存在しないものだったので失念していました。
ありがとうございます。
投稿者: Keita | 2007年1月17日 10:49
array_puth?
誤字ですかな??
投稿者: ぺ | 2009年6月14日 18:38