Bu ilginç. Peki bu çözüm hakkında?
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,!]');
Bu yazdırır
test cheese??test cheese??test cheese??
Işlevi, boru iki argüman alır. İlk başlangıç değeri ve ikincisi için ilk argüman uygulamak için fonksiyonları bir boru ayrılmış listesi. (Parantez PHP kullanılan gibi) çok argüman işlevleri için izin vermek için, [ve] karakterleri kullanılabilir. Tutucu '!' nerede zinciri boyunca dizeleri eklemek için belirtmek için kullanılır.
Yukarıdaki örnekte, şu olur:
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??'
Karakterler [,], ve! keyfi seçildi. Ayrıca, bu bu sağlamak için genişletilmiş olabilir rağmen, işlev argüman olarak virgül kullanmak için izin vermez.
İlginç bir soru!
(Fikir '|'. Ayrılmış Kod Ateşleyici alınan fonksiyonların listesi, onlar değişken değiştirme yapmıyoruz rağmen Ayrıca kolayca bir dize dizisi olabilir, ama array () yapıcısı ayrıntılı olduğu)