3

我在一些图书馆看到过这样的事情:

$this->getResponse()->setRedirect($returnUrl);

这个“多重调用”是如何完成的,或者,应该如何构建这个类来做这样的事情?

我认为 :

class greeting
{
    public function hi()
    {
        public function howAreYou()
        {
            echo 'How are you?';
        }
    }
}
$greet = new greeting;
$greet->hi()->howAreYou();

但我认为它不太好,我最好使用类似扩展的东西,但我不知道。谢谢你的建议。

4

5 回答 5

4

如果这是一个调用自身的类实例,则称为“方法链接”。

在 PHP 中,可以使用return $this; 请注意,这是一种与类继承非常不同的机制——将它们视为可互换的并没有真正的意义。

另请参阅:https ://stackoverflow.com/search?q=method+chaining+php

于 2012-04-30T11:26:40.993 回答
3

getResponse()正在返回一个具有setRedirect()方法的类实例。

例子:

class Foo
{
    public function getResponse()
    {
        $redirect = new Bar();
        return $redirect;
    }
}

class Bar
{
    public function setRedirect($returnUrl)
    {
        // do something
    }
}

$foo = new Foo();

$foo->getResponse()->setRedirect("returnUrl");
于 2012-04-30T11:26:27.187 回答
2

不。

您所要做的就是在每个函数的最后返回 self 。

所以你的例子就像>

class greeting
{
    public function hi()
    {
        echo "Hi";

        return $this;
    }

    public function howAreYou()
    {
        echo 'How are you?';

        return $this;
    }
}

$greet = new greeting;
$greet->hi()->howAreYou();

甚至:

$greet->hi()->howAreYou()->hi()->howAreYou();
于 2012-04-30T11:27:03.237 回答
1

链接方法与在方法中声明函数不同......实际上后者会报错(不是函数声明,而是你调用它的方式)。为了链接一个方法,只需让它返回对象本身:

Class chainableObject
{
    public $name=null;
    public function __construct($name='')
    {
        $this->name=$name;
        return $this;
    }

    public function setName($name)
    {
        $this->name = $name;
        return $this;//makes chainable
    }

    public function greet()
    {
        echo 'Hello, '.$this->name;
        return $this;
    }
}

$chain = new chainableObject('Frank')->greet();//outputs: Hello, frank

解释:所有方法都返回实例本身,所以基本上,像这样阅读片段的最后一行 [create object with name:Frank]=>call method greet on the return value on this action。由于返回值是$this具有 greet 方法的对象,这就是将要发生的事情......简单,更多信息:只需 google php 方法链接

于 2012-04-30T11:31:21.630 回答
1
    class stutter{
      public function a(){
      echo 'h';
      return $this;
     }
      public function b(){
       echo 'hello world!';
     }
    }

$var=新口吃();变量->a()->b();

输出是:

h你好世界

于 2012-04-30T11:31:42.733 回答