ぶろぐ

日記です

nullと0


if($obj) {
  $obj->getId();
}

的なコードを良く書くけど、そのままのノリでnull じゃない時これやる、ってコードを書いていたら0が代入された時にバグってしけた。

// hoge=0
$param = Request::getParameter('hoge', null);

if($param) {
  // ここに来る!
  hoge();
} else {
  // ここに来てくれるつもりだった。
  foo();
}
// hoge=0
$param = Request::getParameter('hoge', null);

if($param !== null) {
  hoge();
} else {
  // $paramが0のときちゃんとここに来る
  foo();
}

こうしておいたけど、普段はどうしたらいいんだろ。$obj === null か is_null($obj) 使うように癖つけておいたほうがいいのかなーーーーなやみ

空判定

$array_obj = HogeModel::getObjects();
$obj = HogeModel::getObject();
if ( count($obj_array) > 0 ) {}
if ( $obj instanceof Obj ) {}
if ( $obj ) {}

とかを"データ取れなかった時" 判定したいときに使っているのを見たことある。
$obj === null が、どの場合でも上手く動いてくれる危険が少ない判定なのかな。
まぁでも空の配列返すようなメソッドだと null === array() だとfalseなので自分が使うメソッドがどういう値を返すのかを見てコーディングすることは必要。

$hoge = array();
if($hoge === null) {
  echo "null";
} else {
  echo "no null";
}

ちょっと考えてまとめ

nullアクセス防止なら

オブジェクトにアクセスできなかった時のnull落ちを防ぐだけならif($obj){} 判定が一番スマートだと思ってる。

0が入ってくる可能性がある場合は

プリミティブ型の時はif($primitive !== null) かisset() 使って、オブジェクト型の時はif($obj) {} つかお。