在使用php编写gateway代理请求的时候,如果要改变请求,为什么要使用clone

在使用php编写gateway代理请求的时候,如果要改变请求,为什么要使用clone,但是clone只能对于属性进行clone,对象是潜拷贝啊。
我知道在psr7中定义的是HTTP 请求和响应必须要被视为无法修改的,但是因为由想到clone是对于对象的属性是深拷贝,但是对象中的对象是潜拷贝,有点想不通,求大神解惑。

阅读 1.5k
1 个回答

PSR7里能修改的都给了对应的接口withXXXX,作为库的使用者是不需要clone的,例如guzzled的实现已经帮你clone了,需要更新的属性也给你更新了:

public function withUri(UriInterface $uri, $preserveHost = false)
{
    if ($uri === $this->uri) {
        return $this;
    }
    $new = clone $this;
    $new->uri = $uri;
    if (!$preserveHost) {
        $new->updateHostFromUri();
    }
    return $new;
}

你自己clone然后去直接改属性(正常都是private,你也改不了)是不能保证不可变的,但是你只用withXXX这些方法,就可以保证不可变。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题