带循环的PHP方法链

时间:2017-12-23 10:45:38

标签: php methods

您好我正在努力建立一个模仿Gouette作为学习练习的课程:

https://github.com/FriendsOfPHP/Goutte/blob/master/README.rst

我认为我通过使用方法链接走在正确的轨道上我认为他们正在做的事情,我不确定他们是如何做这样的事情:

$crawler->filter('h2 > a')->each(function ($node) {
    print $node->text()."\n";
});

这会是某种匿名功能吗? 到目前为止,这是我的代码:

class Bar  
{
    public $b;

    public  function __construct($a=null) {

    }
    public function chain1()
    {
        echo'chain1';
        return $this;
    }

    public function loop($a)
    {
        echo'chain2';       
        return $this;
    }

    public function chain2()
    {
        echo'chain2';       
        return $this;
    }
}

$a=array('bob','andy','sue','rob');
$bar1 = new Bar();
$bar1->chain1()->loop($a)->chain2();

1 个答案:

答案 0 :(得分:1)

我已经尝试简化代码,以显示您之后的这一方面......

class Bar
{
    private $list;

    public  function __construct($a=null) {
        $this->list = $a;
    }

    public function each( callable $fn )
    {
        foreach ( $this->list as $value )   {
            $fn($value);
        }
        return $this;
    }
}

$a=array('bob','andy','sue','rob');
$bar1 = (new Bar($a))->each(function ($value) {
    print $value."\n";
});

如您所见,我已使用您拥有的列表创建了对象,然后使用each()调用callable。您可以看到该函数只接受传入的值并将其回显。

然后在each()中,构造函数中提供的列表中的所有项都有一个循环,并使用列表中的每个值调用闭包($fn($value);)。

这个输出是......

bob
andy
sue
rob

对于链式调用,这个想法是(正如你已经解决的那样)是返回一个对象,它将成为下一个调用的起点。有些人使用$this(正如你所做的那样)某些系统(如Request通常所做的那样)返回传入的对象的新副本。这通常与不可变对象的概念相关联。这个想法是你永远不会改变原始对象,但你创建了一个新对象,并在其中进行了更改。 Psr7 Http Message, why immutable?可以更深入地了解这一点。