【问题标题】: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。

【问题讨论】:

标签: php oop zend-framework return


【解决方案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);
          

          【讨论】:

            猜你喜欢
            • 2012-09-17
            • 1970-01-01
            • 2017-03-02
            • 2022-01-09
            • 1970-01-01
            • 2018-10-29
            • 1970-01-01
            • 2011-06-20
            • 2012-05-04
            相关资源
            最近更新 更多