PHP OOP Multicall

时间:2012-04-30 11:23:24

标签: php oop

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

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

这个'multicall'是如何完成的,或者,如何构建类来做这样的事情?

我想:

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

但我觉得它不太好,我会更好地使用像延伸这样的东西,但我不知道。谢谢您的建议。

5 个答案:

答案 0 :(得分:4)

如果这是一个调用自身的类实例,则会调用"方法链接"。

在PHP中,可以使用return $this完成;请注意,这是一种与类继承非常不同的机制 - 将它们视为可互换的方式并不合理。

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

答案 1 :(得分: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");

答案 2 :(得分:2)

没有

您需要做的就是在每个功能的最后返回自我。

所以你的例子就像>

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

答案 3 :(得分: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 this action的返回值。由于返回值为$this,具有greet方法的对象,即将发生的事情......简单,更多信息:只是谷歌 php方法链接

答案 4 :(得分:1)

    class stutter{
      public function a(){
      echo 'h';
      return $this;
     }
      public function b(){
       echo 'hello world!';
     }
    }

$ var = new stutter(); VAR->一种() - > B();

输出是:

  

h hello world