“return $this” 是什么意思?

35

我正在尝试理解这段代码,但当我到达最后一行时,我没明白。 :(

你能帮我找出 return $this 是什么意思吗?

public function setOptions(array $options) {
    $methods = get_class_methods($this);
    foreach ($options as $key => $value) {
        $method = 'set' . ucfirst($key);
        if (in_array($method, $methods)) {
            $this->$method($value);
        }
    }

    //???? - return what ?
    return $this;
}

更新:
我已经删除了我的评论以便更好地阐明。


可能是11072965的重复问题。 - musafar006
这对我来说意义重大,伙计。 - kta
7个回答

74

这种编码方式被称为“流畅接口” (fluent interface)。 return $this 返回当前对象,因此您可以编写如下代码:

$object
  ->function1()
  ->function2()
  ->function3()
  ;

改为:

$object->function1();
$object->function2();
$object->function3();

1
在PHP中,调用必须像那样分开成不同的行吗?我更经常看到链式调用在一行上,像这样:$object->chop()->putInBowl()->bakeForTen(); 在PHP中不可以吗? - Ziggy
它们不一定需要这样,但我发现这种方式更易读 - 包括将分号放在自己的一行。 - Maerlyn
1
我们能否在所有方法的结尾处使用 return $this 以方便使用? - MEM
4
你需要考虑你的类的使用方式 - 如果你可能会在彼此之后调用多个方法,那么使用方法链将非常方便。一个完美的例子是Doctrine的Doctrine_Query类。 - Maerlyn
我明白了,当我们使用 create()->from()->where()->leftJoin() 这些方法时,它们实际上都是方法。非常好。 :) - MEM
显示剩余2条评论

8
这将返回调用此方法的实例。通常这样做是为了实现流畅接口,这样您就可以调用类似以下的内容:
CoolClass::factory('hello')->setOptions(array('coolness' => 5))->sayHello();

在同一个对象上调用setOptionssayHello


7

$this指的是当前对象,即正在运行该方法的对象。通过返回$this,将对该方法正在操作的对象的引用发送回调用函数。

因此,任何执行以下操作的人:

 $foo2 = $foo->SetOptions($bar);

$foo2现在也指向$foo。


5
你只需创建一个函数链。
class My_class
{

        public function method1($param)
        {
                /*
                 * logic here
                 */

                return $this;
        }

        public function method2($param)
        {
                /*
                 * logic here
                 */

                return $this;
        }

        public function method3($param)
        {
                /*
                 * logic here
                 */

                return $this;
        }

}

所以你可以使用这个

            My_class obj = new My_class();

            $return = obj->method1($param)->method2($param)->method3($param);

4

这个类中包含了该函数。

所以,如果你像下面这样调用它:

$obj->setOptions($options)

它会返回已经设置了新选项的$obj对象。通常情况下,当像这样设置某些东西时,你不需要捕获返回值,因为它会影响到对象本身,但是这使得你可以在同一行中使用它。


我喜欢你的笔记,你不必捕获返回值。这正是我想要的。 - ShiningLight
1
"$this would be the class that..." - 不是类,而是对象实例。 - Csongor Halmai

1
如果SetOptions方法是ProgramOptions类的一部分或其他什么东西,$this将指向包含该方法的类,因此您将传回ProgramOptions的一个实例。

1

这是一种常见的面向对象编程技术,称为流畅接口。它的主要目的是帮助在不支持方法级联的语言中链接多个方法调用,例如PHP。因此,

return $this;

将返回该类的更新实例(对象),以便在其作用域内进行另一个调用。请参见PHP示例。

class Class_Name {
    private field1;
    private field2;
    private field3;

    public function setField1($value){

        $this->field1 = $value;

        return $this; 
    }

    public function setField2($value){

        $this->field2 = $value;

        return $this; 
    }

    public function setField3($value){

        $this->field3 = $value;

        return $this; 
    }
} 

$object = new Class_Name();
$object->setField1($value1)->setField2($value2)->setField3($value3);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接