これは面白い。このソリューションはどうですか?
function pipe($v, $fs)
{
foreach(explode('|', $fs) as $f)
{
if(strpos($f, '[') === FALSE){
$v = call_user_func($f, $v);
}else{
list($fun, $args) = explode('[', trim($f), 2);
$args = explode(',', str_replace('!', $v, substr($args, 0, -1)));
$v = call_user_func_array($fun, $args);
}
}
return $v;
}
echo pipe(' test STRING??', 'trim|strtolower|str_repeat[!,3]|str_replace[string,cheese,!]');
これは印刷されます
test cheese??test cheese??test cheese??
関数パイプは2つの引数を取ります。1つ目は初期値で、2つ目は最初の引数に適用する関数のパイプ区切りリストです。マルチ引数関数を使用できるようにするために、[および]文字を使用できます(PHPで括弧が使用されているように)。プレースホルダー'!' チェーンに沿って文字列を挿入する場所を指定するために使用できます。
上記の例では、次のようになります。
trim(' test STRING??') => 'test STRING??'
strtolower('test STRING??') => 'test string??'
str_repeat('test string??', 3) => 'test string??test string??test string??'
str_replace('string', 'cheese', 'test string??test string??test string??') => 'test cheese??test cheese??test cheese??'
文字[、]、および!任意に選ばれました。また、これを許可するように拡張することはできますが、関数の引数でコンマを使用することはできません。
面白い質問です!
(変数の置換は行いませんが、Code Igniterから取得した関数の'|'区切りリストのアイデア。文字列配列にすることも簡単ですが、array()コンストラクターは冗長です)