2014-11-28 追記
関数合成については Composer からインストール可能な形で yuyat\compose
というのを作ったので、そちらをご利用ください。
yuyat\compose
は PHP 5.6 以降でないと使えませんが、それ未満のバージョンであれば igorw\compose
を使うのが良いでしょう。
「関数型Ruby」という病(2) - 関数合成 Proc#compose という記事が面白かったので
compose.php
<?php
class ComposableFunction
{
/**
* @var callable
*/
private $fn;
/**
* Constructor
*
* @param callable $fn
*/
public function __construct(callable $fn)
{
$this->fn = $fn;
}
/**
* Invokes function
*/
public function __invoke()
{
return call_user_func_array($this->fn, func_get_args());
}
/**
* Composes new function
*/
public function compose(callable $fn)
{
return new static(function () use ($fn) {
return $fn(call_user_func_array($this, func_get_args()));
});
}
}
$splitWithUnderscore = new ComposableFunction(function ($str) {
return explode('_', $str);
});
$mapUcfirst = function ($words) {
return array_map('ucfirst', $words);
};
$camelize = $splitWithUnderscore->compose($mapUcfirst)->compose('join');
var_dump($camelize('foo_bar_baz'));
// => FooBarBaz