PHPコードの注意点
PHPは5以降、最新のプログラミングの概念を多く持つ新しい言語になっている。
しかしPHPは微妙に設計がまずいところもあり、それらを回避するには微妙にノウハウが必要だ。
この投稿の目的
- 実際にPHPコードを書く時の注意点
いろんな『値がない』状態
これはよく、PHPがdisられる要因に、よくなっているところだ。
『値がない』というのは、他の言語でも様々な状態のことをいう。
例えば
- null
- false
- 空文字
- 空リスト
- 0
- -1
である。
慣れれば実際便利なこともある。
しかし、様々な関数の戻り値も一定ではない(一環して0や-1をfalseとして返せばいいのだが、そうではない)ので、ここを正確に扱うにはノウハウが必要だ。
そこで、各値について、どのように判定するのかを書いてみたい。
null
全ての判定の前に、この判定を行う必要があることは明白だ。
まずnullではないからこそ、その他の全ての判定がある。
この判定には、以下のように行う
<?php if( $a ){ }
すなわち、$aという値に対してtrueかfalseかを判定する。
これは多くの場合正しいが、実は間違っている。
ちなみに、正しくは
<?php if( isset( $a ) ){ }
何故かというと、始めのコードで判定すると、もし$aがnullで、何もセットしていない場合、noticeのレベルで、エラーが発生する。
普段このエラーは表示していないので問題ないが、いざエラーログを取る必要が出た時、このnoticeレベルのログが大問題となる。
このような慣習で書いたコードでは、大量に発生するからだ。
本来見るべきエラーログが、このnoticeのログで埋まってしまい、わからなくなる。
また、エラーを書き込んでいる分、コストも増える。
issetは関数ではなく言語構造であり、関数コールのコストも発生しない。また、値がnullであった場合にもnoticeが発生しない。
よって全ての変数はこのissetによって判定してから、中身を確認すべきである。
false
次に、falseであるかどうかの判定である。
この判定は、まずnullではないか確認して、次にfalseかどうかを判定する
<?php if( isset( $a ) and $a === false ){ }
nullでもfalseでも真とする場合は
<?php if( !isset( $a ) or $a === false ){ }
になる。
『===』は型と値の両方の一致を確認する演算子だ。
空文字
空文字かどうか判定する方法は以下になる。
<?php if( isset( $str ) and $str !== "" ){ }
空リスト
空リストかどうか判定するには以下にようになる。
<?php if( isset( $a ) and is_array( $a ) and empty( $a ) ){ }
また、nullか、配列でないか、配列であっても空なのかを判定するには以下のようになる
if( !isset( $a ) or !is_array( $a ) or empty( $a ) ){ }
0
関数の戻り値として、0をfalseとして返す場合もある。
この場合、それが文字列ではなく、数値の0かを正確に判定する必要がある。
<?php if( isset( $a ) and $a === 0 ){ echo $a; }
-1
関数の戻り値として、-1が関数falseになるのは、より良い選択肢だ。
<?php if( isset( $a ) and $a === -1 ){ echo $a; }
いろんな関数の戻り値
関数の戻り値として、PHPでは一貫して同じようなルールが何故か適用されていない。これは非常に注意するべき点が多い。
中でもよく言われるのは、strposである。
strposはある文字列の中にある文字列が存在するとき、その文字列が何文字目にあるかどうかを返す。
<?php $a = "abc"; if( strpos( $a , 'a' ) ){ }
これをすると、strposは0を返す。if文では、0はfalseとして判定される。
よってこれは思い通りに動かない。
この際は、以下のようにしなければならない
<?php if( strpos( $a , 'a' ) !== false ){ }
strposはまったく見つからなかった場合、falseを返す。
よってこれを型とあわせて確認する必要がある。
まとめ
PHPは実際に、様々に一貫していないところもあるが、『最も手軽』な言語であることは間違いがなく、それ故仕事にも直結する。
注意して扱うことによって、ハマる時間を短縮していきたい。