什么“返回$ this”是什么意思?

时间:2011-05-10 21:59:01

标签: php oop zend-framework return

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

我可以帮助您了解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;
}

更新
我删除了我的评论以便更好地澄清。

7 个答案:

答案 0 :(得分:60)

这种编码方式称为fluent interfacereturn $this返回当前对象,因此您可以编写如下代码:

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

而不是:

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

答案 1 :(得分:6)

这将返回调用此方法的实例。这通常用于实现fluent interfaces,因此您可以调用以下内容:

CoolClass::factory('hello')->setOptions(array('coolness' => 5))->sayHello();

在同一个对象上调用setOptionssayHello的位置。

答案 2 :(得分:5)

$this表示当前对象,当前正在运行该方法的对象。通过返回$this对该对象的引用,该方法将被发送回调用函数。

所以任何人都在做

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

$ foo2现在也指$ foo。

答案 3 :(得分:4)

$这将是包含该函数的类。

所以如果你这样称呼它:

$obj->setOptions($options)

它将返回$ obj,已使用新选项设置。通常,当像这样设置某些内容时,您不必捕获返回,因为它会影响对象本身,但它会使它可以内联使用它。

答案 4 :(得分:2)

你可以创建一个功能链

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

答案 5 :(得分:1)

如果SetOptions方法是ProgramOptions类的一部分,那么$ this将引用包含该方法的类,因此您将传回一个ProgramOptions实例。

答案 6 :(得分:0)

它是一种常见的OOP技术,称为Fluent Interface。它的主要目的是帮助在语言中链接多个方法调用,不支持方法级联,如PHP。所以

  

返回$ 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);