PHPで関数合成を書いてみる

PHP で関数合成 - Qiita [キータ]

こちらの投稿がとても興味深かったので、自分なりに書いてみました。

<?php
class Compose
{
    public static function _()
    {
        $callables = func_get_args();

        return array_reduce($callables, function ($a, $b) {
            if ($a === null) {
                return function () use ($b) {
                    return call_user_func_array($b, func_get_args());
                };
            } else {
                return function ($arg) use ($a, $b) {
                    return call_user_func($b, $a($arg));
                };
            }
        });

    }
}


$mapUcfirst = function ($arg) {
    return array_map('ucfirst', $arg);
};

$splitWithUnderscore = function ($arg) {
    return explode('_', $arg);
};


$camelize = Compose::_($splitWithUnderscore, $mapUcfirst, 'join');
var_dump($camelize('man_with_a_mission'));
// ManWithAMission