①Factoryパターンの代替
呼び出し側
$type = "rakuten";
// 他には Yahoo, Amazonなど
// 在庫数を取得する
$arDef = ExampleStockFactory:factory($type);
// 配列内のクロージャは直接呼べないので、1度代入する
$fn = $arDef["fn"];
// 在庫数の取得
$stockNum = $fn();
ExampleStockFactory
class ExampleStockFactory {
public static function factory($type){
switch( true ){
case preg_match( "/[正規表現など]/", $type );
case $type == "rakuten" : // 楽天APIを叩く
// APIキー
$apiKey = "secrete api key";
// クロージャを定義
$fn = function() use ($apiKey){
return RakutenApi::getStock($apiKey);
};
break;
case "...." : //others
default : // 該当なしの場合は、NullObjectで返す
$fn = function(){ return -1 };
}
// 配列形式で付随情報と共に返す
return array(
"type" => $type,
"fn" => $fn
);
}
}
なぜクロージャなのか
デザインパターンをご存知の方は、この記述がFactoryパターンとNullObjectパターンの代替である事は、お分かりになると思います。
しかし、
PHPでわざわざクラス定義ファイルを書くのは面倒
という時に、この書き方をしてみるといいかもしれません。
PHPにクロージャって必要??
色々と使ってみたところ、リソース節約したい時に結構使えます。