好还是坏?带来;“功能链接”;PHP的功能

好还是坏?带来;“功能链接”;PHP的功能,php,language-features,Php,Language Features,所以我在想,一种可以将方法链接引入带有内置全局函数的PHP的方法是“借用”F#中的|>(pipe)操作符。它将把左边的结果导入右边函数的第一个参数。当然,PHP必须重新检查一些函数的参数顺序 这将允许您编写: function StrManip($val) { return str_repeat(strtolower(trim($val)),2); } 像这样: function StrManip($val) { return $val |> trim() |&g

所以我在想,一种可以将方法链接引入带有内置全局函数的PHP的方法是“借用”F#中的|>(pipe)操作符。它将把左边的结果导入右边函数的第一个参数。当然,PHP必须重新检查一些函数的参数顺序

这将允许您编写:

function StrManip($val) {  
  return str_repeat(strtolower(trim($val)),2);  
}  
像这样:

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

我以前从未见过这种注释,但它看起来确实不错。不知怎的,这让我想起了函数式编程(也许只是我)

但我实际上已经不再希望PHP小组对该语言进行如此根本性的更改。他们似乎在追赶其他语言——他们看别人在做什么,然后选择他们喜欢的,以及适合(ir)PHP世界的。以面向对象和名称空间为例,当您看到竞争对手时,它们是非常新的特性


一、 我个人希望看到命名参数(ála“
strpos(needle=$foo,haystack=$bar)
”),因为我在Python中看到了它们。从那时起,PHP设计小组实际上必须实现它。

类似的事情可以通过使用fluent对象方法来实现。例如:

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

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

$foo = new Foo();

$foo->bar()->bar2();
class-Foo
{
公共功能条()
{
回音“你好
”; 退还$this; } 公共职能部门2() { 回音“再见
”; 退还$this; } } $foo=新foo(); $foo->bar()->bar2();
产出如下:

你好

再见

看起来他想要的是一个String类,该类包含镜像内置函数的方法。这是一个猜测,但也许您可以使用uuu call magic方法来完成以下工作:

(未经测试)


您必须进行一些解析才能使$arguments部分正常工作,当您链接方法时,它将创建许多对象,但从理论上讲,这将为您提供所需的一些功能。

这很有趣。这个解决方案怎么样

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??
函数管道有两个参数。第一个是初始值,第二个是应用于第一个参数的以管道分隔的函数列表。为了支持多参数函数,可以使用[and]字符(就像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中获取的“|”分隔函数列表的想法,尽管它们不进行变量替换。它也可以很容易地成为字符串数组,但数组()构造函数非常冗长)

不幸的是,这绝不会发生:(因此,我想更深层次的问题是,我们是否需要将其他函数式编程语言的习惯用法附加到现有的所有其他语言中。我想说不。顺便说一句,在任何一种普通的面向对象语言中,这一点都非常容易。顺便说一句,我不确定F#,但在Haskell中,函数链接起作用的原因是这是因为实际上每个函数都接受一个参数并返回一个参数——即使这个函数是另一个需要另一个参数的函数。PHP显然不是这样构建的。而且……这可能是一个社区wiki,因为没有“正确答案”是的,但请注意,他所描述的更一般;这需要创建一个特殊的类,其中包含方法,每次都有适当的副作用,这要求PHP完全100%面向对象,而他们似乎对此不感兴趣同意这种推理。我不认为命名参数是一件好事。好吧,它们至少会导致函数的参数传递之间的不一致(参见explode()vs strpos())无关紧要。你不需要记住要传递哪些参数和顺序,只需要知道要传递哪些参数。我想这是一个品味的问题,那么。同意。我个人希望有选择。我自己也想过这个,但没有编写任何代码来测试这个想法,但我喜欢你所做的。我没有权利这样做deas关于如何做参数…我的等价物是管道('SomeThing','trim | strtolower)…我只会在字符串中添加引号-请参阅下一篇评论Echo管道('test STRING??,'trim | strtolower | str|u repeat[!,3]| str u replace[“STRING”,“cheese”,“!]));+1-我必须看看Code Igniter在这方面做了什么。我见过其他框架,如CakePHP,对某些函数使用快捷方式别名,以减少函数包装的难看性。我还想过使用快捷方式函数来创建对象(如jQuery).但是如果你把这个对象堆满了函数,那么实例化它就要付出代价。
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??'