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は実際に、様々に一貫していないところもあるが、『最も手軽』な言語であることは間違いがなく、それ故仕事にも直結する。
注意して扱うことによって、ハマる時間を短縮していきたい。