6

重複の可能性:
phpでのオブジェクトのクローン作成とは何ですか?

「クローン」キーワードを頻繁に使用する既存のフレームワークを研究していますが、これがこれを行うのに良いアイデアかどうかわかりませんか?'clone'キーワードを使用する必要性を本当に理解していません。

たとえば、このコーディングを見てください

すなわち

  public function getStartDate ()
  {
    return clone $this->startDate;
  }

私にとって、この関数は以下のようになっているはずです。クローンの必要性はわかりません。

  public function getStartDate ()
  {
    return $this->startDate;
  }
4

3 に答える 3

8

クローンを使用する理由は、オブジェクトを操作するときにPHPが常にオブジェクトをコピーではなく、参照として返すためです。

そのため、オブジェクトを関数に渡すときに、&(参照)でオブジェクトを指定する必要はありません。

function doSomethingWithObject(MyObject $object) { // it is same as MyObject &object
   ...
}

したがって、オブジェクトのコピーを取得するには、cloneキーワードを使用する必要があります。これは、オブジェクトがphpによって処理される方法と、cloneが行うことの例です。

class Obj {
    public $obj;
    public function __construct() {
        $this->obj = new stdClass();
        $this->obj->prop = 1; // set a public property
    }
    function getObj(){
        return $this->obj; // it returns a reference
    }
}

$obj = new Obj();

$a = $obj->obj; // get as public property (it is reference)
$b = $obj->getObj(); // get as return of method (it is also a reference)
$b->prop = 7;
var_dump($a === $b); // (boolean) true
var_dump($a->prop, $b->prop, $obj->obj->prop); // int(7), int(7), int(7)
// changing $b->prop didn't actually change other two object, since both $a and $b are just references to $obj->obj

$c = clone $a;
$c->prop = -3;
var_dump($a === $c); // (boolean) false
var_dump($a->prop, $c->prop, $obj->obj->prop); // int(7), int(-3), int(7)
// since $c is completely new copy of object $obj->obj and not a reference to it, changing prop value in $c does not affect $a, $b nor $obj->obj!
于 2012-08-30T11:12:24.397 に答える
4

おそらくstartDateオブジェクトです。

それで。戻るclone $this->startDateと、オブジェクトの完全なコピーが取得されます。それで遊んだり、値を変更したり、関数を呼び出したりすることができます。そして、それらがデータベースまたはファイルシステムに影響を与えるまで、それは安全であり、実際のstartDateオブジェクトは変更されません。

ただし、オブジェクトをそのまま返す場合は、参照のみを返します。そして、あなたが行うオブジェクトを使った操作-あなたは元のオブジェクトを使ってこの操作を行います。変更を加えると、それに影響しstartDateます。

これはオブジェクト専用であり、値型変数であるため、配列、文​​字列、および数値には影響しません。

値型変数と参照型変数についてもっと読む必要があります。

于 2012-08-30T11:02:47.470 に答える
1

別の質問で完全に説明されているにもかかわらず(この@geraldを指してくれてありがとう)

簡単な答え:

クローンがない場合、関数はstartDateオブジェクトへの参照を返します。クローンを使用すると、コピーが返されます。

返されたオブジェクトが後で変更される場合は、コピーのみが変更され、元のオブジェクトは変更されません。これは、別の場所でも使用される可能性があります。

于 2012-08-30T11:02:19.220 に答える