İyi ya da kötü?

4 Cevap php

Bu yüzden PHP ile içine zincirleme yöntemi getirebilir bir şekilde düşünüyordum yerleşik küresel işlevlere "ödünç" olacaktır | F # dan> (boru) operatörü. Bu boru sağdaki fonksiyonun ilk parametresine sol sonuçları olur. Tabii PHP işlevleri bazı parametre sırasını tekrar olurdu.

Bu yazmak için izin verecek:

function StrManip($val) {  
  return str_repeat(strtolower(trim($val)),2);  
}

Bu gibi:

function StrManip($val) {  
  return $val |> trim() |> strtolower() |> str_repeat(2);  
}

4 Cevap

Ne istediğini yerleşik işlevleri ayna yöntemleri ile bir String sınıfı gibi görünüyor. Bu bir tahmin olduğunu, ama belki böyle işi yapmak için __ çağrı sihirli yöntemini kullanabilirsiniz:

(untested)

class String {
   private $_value = '';
   public function __construct($value) {
      $_value = $value;
   }
   public function __call ($name, $arguments) {
      return new String($name($_value, $arguments));
   }
}

$string = new String($string);
echo $string->trim()->strtolower()->str_repeat(2);

Eğer iş için $ argümanlar kısmını almak için bazı ayrıştırma yapmak gerekir, ve yöntemleri zincir zaman nesneleri bir sürü oluşturmak, ama teoride bu size aradığınız bazı işlevler almalısınız.

Ben önce bu şerhi görmedim, ama emin güzel görünüyor. Her nasılsa işlevsel programlama (belki sadece benim) hatırlatıyor.

Ama aslında PHP grup diline böyle köklü değişiklikler yapmak umuduyla bıraktım. Bunlar, diğer diller ile catch-up oynamak gibi - onlar diğer insanların ne yaptığını bakmak, ve sonra onlar ne gibi almak ve (ir) PHP dünyayı yakışıyor. Eğer rekabete baktığımızda nesne odaklığı ve ad alanları, örnek olarak, oldukça yakın özellikleri vardır.

Ben, şahsen, ben Python eylem onları gördüm beri adlandırılmış parametreleri (á la "strpos(needle=$foo, haystack=$bar)") görmek için umut. O zamandan beri, PHP tasarım grubu refused bunu uygulamak aslında vardır.

Gibi çok şey akıcı nesnesi yöntemleri kullanılarak gerçekleştirilebilir. Örneğin:

class Foo 
{
    public function bar()
    {
        echo 'Hello<br/>';
        return $this;
    }

    public function bar2()
    {
        echo 'Goodbye<br/>';
        return $this;
    }   
}

$foo = new Foo();

$foo->bar()->bar2();

Aşağıdaki çıkarır:

Hello
Goodbye

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)