PHP

PHP で関数合成

More than 3 years have passed since last update.

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