4

所以我在想一种方法,你可以使用内置的全局函数将方法链接引入 PHP,那就是从 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 小组会对语言做出如此根本的改变。他们似乎在追赶其他语言 - 他们看看其他人在做什么,然后他们选择他们喜欢的东西,以及适合(他们)PHP世界的东西。例如,当您查看竞争时,面向对象和命名空间是相当新的功能。

我个人希望看到命名参数(á la " strpos(needle=$foo, haystack=$bar)"),因为我在 Python 中看到了它们。从那以后,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??

函数管道有两个参数。第一个是初始值,第二个是要应用于第一个参数的以竖线分隔的函数列表。为了允许多参数函数,可以使用 [ 和 ] 字符(就像在 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 回答