連想配列にデフォルト値を適用しつつパラメータを上書き設定する方法

classのデフォルト値を設定する時などに便利なこと。


説明のためのソース

$params  = array('host'=>'192.168.1.1', 'dummy'=>'hoge');
$default = array('host'=>'localhost', 'port'=>80);
$params = array_intersect_key($params, $default) + $default;
print_r($params );

出力

Array
(
    [host] => 192.168.1.1
    [port] => 80
)


array_intersect_key;
すべての引数に存在するキーのものを含む連想配列を返す。
同じキーの場合、最初の引数の値を返す。
 →配列のキー'host'が共通なので、'host'=>'192.168.1.1' が返る。共通でない'dummy'は無視される。


配列の結合演算子(+);
「+」演算子は、右側の配列を左側の配列に追加したものを返す。
両方の配列に存在するキーについては左側の配列の要素が優先され、右側の配列にあった同じキーの要素は無視される。
 →配列キー'host'は無視され、配列キー'port'だけ追加される。



class の例

$params = array('host'=>'192.168.1.1');

$obj = new hoge($params);
print_r($obj->conf);


class hoge{
  public $conf = array('host'=>'localhost', 'port'=>80);

  function __construct(array $params){
    $this->conf = array_intersect_key($params, $this->conf) + $this->conf;
  }
}


出力

Array
(
    [host] => 192.168.1.1
    [port] => 80
)


$params にclass側でデフォルト値が定義されていない無効なパラメータが指定されても無視され、デフォルト値が定義されているパラメータ名のものだけが上書き設定される。