2017-07-28 5 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'で使用する10のうち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

関連する問題