phpで省略可能(Optional)な引数を実現したい

オプショナルの引数やりたいなー、って思って調べたら、出来そうでしたので、備忘録として、記述しておきます。

引数を省略したい。

例として、リストを出すような場合を想定します。

条件を付けた時だけ、その条件を元にデータを絞り込んで、条件が無かったら全件出したい、などですね。

そんな時の実装として、以下のような関数を作ったとします。

<?php
function getCustomer($name)
{
  if (name == null) {
    $sql = "SELECT * FROM customer";
    $data = /* ~ データ抽出処理 ~ */
  } else {
    $sql = "SELECT * FROM customer WHERE NAME = :name";
    $params = array(
      'name'=>$name,
    );
    $data = /* ~ データ抽出処理 ~ */
  }

  return $data ;
}

// 絞り込みたい場合
// 顧客名が hoge の人だけが抽出
echo getCustomer('hoge');

// 絞り込みたくない場合
// 全ての顧客が抽出
echo getCustomer(null);
?>

でも、絞り込みたくない箇所で毎回、getCustomer(null)なんて書くのはだるいですよね。

そんな時には、このように実装します。

<?php
function getCustomer($name = null)
{
  if (name == null) {
    $sql = "SELECT * FROM customer";
    $data = /* ~ データ抽出処理 ~ */
  } else {
    $sql = "SELECT * FROM customer WHERE NAME = :name";
    $params = array(
      'name'=>$name,
    );
    $data = /* ~ データ抽出処理 ~ */
  }

  return $data ;
}

// 絞り込みたい場合
// 顧客名が hoge の人だけが抽出
echo getCustomer('hoge');

// 絞り込みたくない場合
// 全ての顧客が抽出
echo getCustomer();
?>

function getCustomer($name = null) の部分に注目してください。

いわゆる引数にデフォルト値を設定しておく、という手法で、$name = null と設定しておくことで、getCustomer();getCustomer(null); の呼び出しは全く同じ結果となります。