[PHP]null値ならデフォルト値を返すifnull()の使い方

Read More



SQLにifnull関数というのがある。

書式は以下の通り。
ifnull(値1, 値2)

値1がnull値の時は戻り値に引数2を返す。
値1がnull値じゃない場合は値1を返す。


これと同じ挙動をするものをPHPで実装する場合は以下のようにする。

■ifnull()の定義
<?php
/**
 * null値の時にデフォルト値を返却する
 * 
 * 引数1がnull値なら戻り値は引数2の値を返す。
 * 引数1がnull値じゃない場合は戻り値は引数1の値を返す。
 * 
 * @param mixed
 * @param mixed
 * @return mixed
 */
function ifnull($target=null, $default=null)
{
  if(!is_null($target)) return $target;

  return $default;
}

$var = null;
echo ifnull($var, 'hoge');
?>



■実行結果
> hoge




--
ここからは余談。

ifnullと同じ挙動をする関数は以前から作って使っていたけどこちらは関数名がいまいちよくなかった。
関数名はifnull()でもif_null()でもいい気がするがひとまずSQLの関数と同じ方がわかりよい気がする。
SQLの関数と同じにしておけば忘れにくいし挙動も想像しやすくなるのでしばらくはこれでいいと思った。

ただnull値用のifnull()があるのなら、
''(空文字)用のifkaramoji()、
0と'0'用のifzero()、
nullと''用のifnullkaramoji()、
nullと''と0と'0'とarray()とfalse用のifempry()などもあってもいいなと。

ただこの場合if_karamoji()とかアンダーバーを間に入れた方が見やすいなとも思う。
それならばifnull()よりもif_null()で統一した方が良さそう。
まあ最後は好みの問題。




--
さて上記のような関数群を考えた場合、いちいち書き分けるのも面倒なのでオールインワンのifval()みたいなものを用意したらどうだろうという所に行き着いた。
第一引数にnullや''といった比較元となる値を指定できるようなもの。
例えばifnull()と同じ挙動をさせるにはこんな感じで書くとかね。
<?php
$var = null;
$default = 'hoge';
echo ifval(null, $var, $default);
?>

第1引数は値判定のベースになるので指定できるのはnull, '', 0, '0', array(), falseみたいな感じだろうか。
0を指定している時に値が'0'だった場合はどう判定すべきか悩む所ではあるが、
自分は厳格な判定を押したいのでこの場合はNGとして処理するべきだと思う。
でなければ0とfalseも同等な扱いとなってくるため。



と、ここまで書いていて気が付いたのは、
これってただの比較関数じゃん!
ってこと。


別にnull値の判定だけじゃなくて普通に数値の10とか文字列の'aaa'とかの比較もできるし。
そして2つが一致したらデフォルト値を返却してるだけの動き。
もはやデフォルト値って言葉も意味をなしてないような気がする。

そしてこれを実装してみたら驚くほどシンプルな内容となった。

■ifval()の実装
<?php
/**
 * 2つの値を比較し一致すれば指定した値を返す
 * 
 * 第1引数と第2引数の値を比較し一致した場合第3引数の値を返す。
 * 一致しない場合は第2引数の値を返す(※)。
 * ※第1ではない点に注意
 * 
 * @param mixed
 * @param mixed
 * @param mixed
 * @return mixed
 */
function ifval($base=null, $target=null, $default=null)
{
  return ($base===$target)? $default: $target;
}

// test
$var = null;
echo ifval(null, $var, 'hoge');

$var = 11;
echo ifval(10, $var, 'piyo');
?>



■実行結果
> hoge
> 11



うーん、strcmp()と通ずるものがあるな。
というか説明文むずかしー。
まあここまで考えたけどたぶん使わない。






コメント投稿

名前 *
(10文字以内)
コメント *
(1000文字以内)