PHP で関数合成

  • 12
    Like
  • 0
    Comment
More than 1 year has 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