2012-08-30 12 views
5

Powiel możliwe:
what is Object Cloning in php?PHP kluczowe klon

uczę się istniejące ramy, które używa „klon” keyword dużo, nie wiem czy to jest dobry pomysł, aby zrobić to? Naprawdę nie rozumiem potrzeby użycia słowa kluczowego "klon".

na przykład mieć wygląd w tym kodowania

t j

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

mi ta funkcja powinna być jak poniżej, nie widzę potrzeby klonu.

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

Sieć [Prototype design Pattern] (http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/ref = sr_1_1) jest również dobrym przykładem użycia. – pce

Odpowiedz

6

Powodem używania klona jest to, że PHP podczas pracy z obiektem zawsze zwraca obiekt jako odniesienie, a nie jako kopię.

Dlatego podczas przechodzenia obiektów do funkcji nie trzeba określić go & (odniesienia):

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

Tak więc w celu uzyskania obiektu skopiować trzeba użyć słowa kluczowego klon to na przykład w jaki sposób obiekty są obsługiwane przez PHP i co robi klon:

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! 
0

mimo to jest perfectley wyjaśnione another question (dzięki za wskazanie tego @gerald)

tylko szybkie odpowiedzi:

bez klon funkcja powraca odniesienie do obiektu startDate. Z klonem powraca kopia.

jeśli zwrócony obiekt zostanie później zmieniony, zmieni tylko kopię, a nie oryginał, który może być również użyty w innym miejscu.

+0

ale problem jest w projekcie w pełni zorientowanym obiektowo, potrzebujemy rzeczywistego obiektu, który ma zostać przekazany, a nie obiektu klona, ​​czyż nie?dla mnie ten projekt przy użyciu obiektów klonów jest niepoprawny w klasie, gdy praktyka projektowania OO używa .. – mahen3d

3

Być może startDate jest obiektem.

Następnie. Po zwróceniu clone $this->startDate - otrzymasz pełną kopię obiektu. Możesz z nią grać, zmieniać wartości, funkcje połączeń. I dopóki nie wpłyną na bazę danych lub system plików - jest to bezpieczne, a rzeczywisty obiekt startDate nie zostanie zmodyfikowany.

Ale jeśli po prostu zwrócisz obiekt taki, jaki jest - zwracasz tylko referencję. I dowolna operacja z obiektem, który wykonujesz - wykonujesz tę operację z oryginalnym obiektem. Każda zmiana, którą wprowadzisz, wpłynie na to startDate.

Dotyczy tylko obiektów i nie ma wpływu na tablice, łańcuchy i liczby, ponieważ są to zmienne typu wartości.

Powinieneś przeczytać więcej na temat zmiennych typu wartości i zmiennych typu referencyjnego.