“return $this”是啥意思?

Posted

技术标签:

【中文标题】“return $this”是啥意思?【英文标题】:What does "return $this" mean?“return $this”是什么意思? 【发布时间】:2011-08-22 20:31:43 【问题描述】:

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

我可以请你帮忙看看,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;

更新: 为了更清楚地说明,我删除了我的 cmets。

【问题讨论】:

[11072965][1] [1] 的可能副本:***.com/questions/11072965/… 这意味着很多朋友。 【参考方案1】:

这种编码方式称为fluent interfacereturn $this 返回当前对象,所以你可以这样写代码:

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

代替:

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

【讨论】:

php 中,调用是否必须像这样在单独的行上?我经常在这样的一行中看到链式调用: $object->chop()->putInBowl()->bakeForTen();用PHP不行吗? 它们不需要,但我发现这种方式更具可读性 - 包括将分号单独放在一行中。 为了方便,我们可以在所有方法的末尾加上return $this 吗? 你需要考虑你的类的使用——如果你可能会在一个之后调用它的多个方法,那么使用方法链接会很方便。一个完美的例子是 Doctrine 的 Doctrine_Query 类。 我明白了,当我们执行 create()->from()->where()->leftJoin()... 每一个实际上都是方法。很不错。 :)【参考方案2】:

这将返回调用此方法的实例。这通常是为了实现fluent interfaces,所以你可以调用类似的东西:

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

setOptionssayHello 将在同一个对象上调用。

【讨论】:

【参考方案3】:

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

所以任何人都在做

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

$foo2 现在也指代 $foo。

【讨论】:

【参考方案4】:

你可以创建一个函数链

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】:

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

如果你这样称呼它:

$obj->setOptions($options)

它将返回 $obj,它已使用新选项进行设置。一般来说,当这样设置时,您不必捕获返回,因为它会影响对象本身,但它会产生它以便您可以内联使用它。

【讨论】:

我喜欢您的说明,即您不必捕获回报。这就是我一直在寻找的。​​span> "$this 将是类..." - 不是类。它是对象实例。【参考方案6】:

如果 SetOptions 方法是 ProgramOptions 类或其他东西的一部分,则 $this 将引用包含该方法的类,因此您将传回 ProgramOptions 的实例。

【讨论】:

【参考方案7】:

这是一种常见的 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);

【讨论】:

以上是关于“return $this”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

return this 和return * this

请问各位大佬这道java的重写equals和重写hashcode方法内部是啥意思呀?

Kotlin:“return@”是啥意思?

return是啥意思

C++11 中的“return ”语句是啥意思?

return,this,arguments,currentStyle和getComputedStyle小析