为啥在 setter 方法中返回 $this?

Posted

技术标签:

【中文标题】为啥在 setter 方法中返回 $this?【英文标题】:Why return $this in setter methods?为什么在 setter 方法中返回 $this? 【发布时间】:2012-06-19 20:08:49 【问题描述】:

检查 Zend 框架,我发现所有 setter 方法(我检查过的那些)都返回它所在的类的实例。它不仅设置一个值,还返回 $this。例如:

  /*   Zend_Controller_Router   */
public function setGlobalParam($name, $value) 
    $this->_globalParams[$name] = $value;
    return $this;


  /*    Zend_Controller_Request    */
public function setBaseUrl($baseUrl = null) 
    // ... some code here ...
    $this->_baseUrl = rtrim($baseUrl, '/');
    return $this;


  /*    Zend_Controller_Action    */
public function setFrontController(Zend_Controller_Front $front) 
    $this->_frontController = $front;
    return $this;

等等。每个公共二传手都返回$this。而且它不仅适用于 setter,还有其他返回 $this 的操作方法:

public function addConfig(Zend_Config $config, $section = null) 
    // ... some code here ...
    return $this;

为什么需要这个?返回$this 有什么作用?有什么特殊含义吗?

【问题讨论】:

返回$(this) 表示可以链接方法,例如$myClass->method_1($x)->method_2($y) 我过去也注意到了这一点,从没想过要问这个问题。谢谢,我现在有了答案。 【参考方案1】:

return $this 允许链接方法,例如:

$foo->bar('something')->baz()->myproperty

【讨论】:

【参考方案2】:

这样就可以像这样“链接”对象上的方法调用。

$obj -> setFoo ('foo') -> setBar ('bar') -> setBaz ('baz') -> setFarble ('farble');

【讨论】:

我知道这条评论是在 2012 年发表的,它的主要目的是演示链式方法的使用,但对于所有刚刚了解这一点的新手:请不要将所有这些空格放在中间! :)

以上是关于为啥在 setter 方法中返回 $this?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用 Promise 时在类方法中未定义“this”? [复制]

设计:Java 和在 setter 方法中返回自引用 [关闭]

JSR 303 Bean 验证 - 为啥使用 getter 而不是 setter?

JSR 303 Bean 验证 - 为啥使用 getter 而不是 setter?

getter和setter方法

setter 方法在 Spring 中不起作用?