4

そこで、組み込みのグローバル関数を使用して PHP にメソッド チェーンを導入する方法の 1 つは、F# から |> (パイプ) 演算子を「借りる」ことだと考えていました。左側の結果を右側の関数の最初のパラメーターにパイプします。もちろん、PHP はいくつかの関数のパラメーターの順序を再検討する必要があります。

これにより、次のように記述できます。

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

このような:

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

4 に答える 4

8

彼が望んでいるのは、組み込み関数をミラーリングするメソッドを持つ String クラスのようです。これは推測ですが、__call マジック メソッドを使用して、次のような作業を行うことができるかもしれません。

(未テスト)

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);

$arguments 部分を機能させるには解析を行う必要があり、メソッドをチェーンすると多くのオブジェクトが作成されますが、理論的には、これにより探している機能が得られるはずです。

于 2009-01-23T07:31:26.977 に答える
3

流暢なオブジェクト メソッドを使用すると、これによく似たことが実現できます。例えば:

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

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

$foo = new Foo();

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

以下を出力します。

こんにちは
、さようなら

于 2009-01-23T06:47:29.590 に答える
2

私は前にその注釈を見たことがありませんが、確かに見栄えがします。なんとなく関数型プログラミングを思い出します(私だけかもしれません)。

しかし、実際には、PHP グループが言語にそのような根本的な変更を加えることを期待するのをやめました。彼らは他の言語に追いつくように見えます - 彼らは他の人が何をしているかを見て、それから彼らが好きなものを選び、(ir) PHP の世界に合うものを選びます。例として、オブジェクト指向性と名前空間は、競合他社を見るとごく最近の機能です。

strpos(needle=$foo, haystack=$bar)個人的には、Python で名前付きパラメーターが実際に動作しているのを見たので、名前付きパラメーター (á la " ") を見たいと思っていました。それ以来、PHP 設計グループは実際に実装を拒否しています。

于 2009-01-23T06:41:33.270 に答える
0

これは面白い。このソリューションはどうですか?

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()コンストラクターは冗長です)

于 2009-01-24T05:02:34.233 に答える