2017-07-28 64 views
0

我正在看一些php代碼,並偶然發現了一個管道腳本。在向管道中添加內容的方法中:PHP管道,爲什麼對象被克隆?

public function pipe(callable $stage) 
{ 
    $pipeline = clone $this; 
    $pipeline->stages[] = $stage; 
    return $pipeline; 
} 

該對象正在克隆並返回。 有人可以解釋我這種方法的優點, 會不會在下面的代碼返回相同的結果?

public function pipe(callable $stage) 
{  
    $this->stages[] = $stage; 
    return $this; 
} 
+1

我想最好的解釋(可能與例子)可以由圖書館的作者提供。 – axiac

+0

@axiac完全同意你的看法!但是,當人們在php關鍵字clone中使用9時 - 他們想要解決一個特定的問題... –

回答

0

不,它不會返回相同的。 Clone創建對象的副本,這有時是所需的行爲。

class WithoutClone { 
    public $var = 5; 

    public function pipe(callable $stage) 
    {  
     $this->stages[] = $stage; 
     return $this; 
    } 
} 

$obj = new WithoutClone(); 
$pipe = $obj->pipe(...); 
$obj->var = 10; 
echo $pipe->var; // Will echo 10, since $pipe and $obj are the same object 
       // (just another variable-name, but referencing to the same instance); 

// ---- 

class Withlone { 
    public $var = 5; 

    public function pipe(callable $stage) 
    {  
     $pipeline = clone $this; 
     $pipeline->stages[] = $stage; 
     return $pipeline; 
    } 
} 

$obj = new WithClone(); 
$pipe = $obj->pipe(...); 
$obj->var = 10; 
echo $pipe->var; // Will echo 5, since pipe is a clone (different object); 
+1

clone()使用__clone()方法創建一個對象的副本,並且如果克隆的對象仍然有副作用具有參考對象的屬性。 – Sebastien