鍍金池/ 問答/PHP/ 在使用php編寫gateway代理請求的時候,如果要改變請求,為什么要使用clo

在使用php編寫gateway代理請求的時候,如果要改變請求,為什么要使用clone

在使用php編寫gateway代理請求的時候,如果要改變請求,為什么要使用clone,但是clone只能對于屬性進行clone,對象是潛拷貝啊。
我知道在psr7中定義的是HTTP 請求和響應必須要被視為無法修改的,但是因為由想到clone是對于對象的屬性是深拷貝,但是對象中的對象是潛拷貝,有點想不通,求大神解惑。

回答
編輯回答
離魂曲

PSR7里能修改的都給了對應的接口withXXXX,作為庫的使用者是不需要clone的,例如guzzled的實現(xiàn)已經幫你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這些方法,就可以保證不可變。

2018年1月5日 18:51