PHP > LIBRARY > object clone
 
PHP
Library
Tip&Tech
Q&A
 
PHP Function
phpschool
그누보드
LIBRARY
  HOME > PHP > LIBRARY
 
object clone
작성일 : 19-01-08
조회 : 133  

Object clone

객체를 clone하기전에 그냥 다른 이름 지정하면 어떻게 되는지를 살펴보자

<?php class User{ public $name; public $age; function __construct($name, $age){ $this->name = $name; $this->age = $age; } } $user1 = new User("Time", 27); $user2 = $user1; $user1->name = "Jake"; var_dump($user1); echo("<br/><br/>"); var_dump($user2); // object(User)#1 (2) { ["name"]=> string(4) "Jake" ["age"]=> int(27) } // object(User)#1 (2) { ["name"]=> string(4) "Jake" ["age"]=> int(27) } ?>

그냥 객체의 변수를 copy하면, 둘은 값을 공유하기 때문에 하나의 값이 바뀌면 다른 것도 바뀐다.

만약 객체를 독립적으로 객체를 복사하고 이후에는 값을 공유하지 못하도록 하기위해선 clone을 이용하면 됨

<?php class User{ public $name; public $age; function __construct($name, $age){ $this->name = $name; $this->age = $age; } } $user1 = new User("Time", 27); $user2 = clone $user1; //clone 추가 $user1->name = "Jake"; var_dump($user1); echo("<br/><br/>"); var_dump($user2); // object(User)#1 (2) { ["name"]=> string(4) "Jake" ["age"]=> int(27) } // object(User)#2 (2) { ["name"]=> string(4) "Time" ["age"]=> int(27) } ?>

Shallow clone

위와 같이 clone을 이용해서 개체의 값을 clone 할 때, 만약 값 중에 객체가 있다면(하위에), 하위 객체의 값은 독립적으로 clone되는게 아니라, 값 자체가 clone되기 때문에 하나를 바꾸면 다른 하나도 바뀐다

<?php class Job{ public $salary; function __construct($jobname){ $this->jobname = $jobname; } } class User{ public $name; public $age; function __construct($name, $age, $object){ $this->name = $name; $this->age = $age; $this->object = $object; } } $job = new Job("cop"); $user1 = new User("Tim", 27, $job); $user2 = clone $user1; $user1->name = "Jake"; $user2->object->jobname = "nurse"; var_dump($user1); // jobname이 nurse echo("<br/><br/>"); var_dump($user2); // jobname이 nurse //하나만 바꿔줬음에도 둘 모두의 하위객체 값이 바뀜 ?>

Deep clone(magic method __clone())

magic method __clone을 이용하면, 독립적으로 객체도 clone할 수 있다.

__clone은 clone될 때 실행되는 magic method이다

위에 user에 function __clone만 추가해주면 됨

class User{ public $name; public $age; function __construct($name, $age, $object){ $this->name = $name; $this->age = $age; $this->object = $object; } function __clone(){ // function clone 추가 $this->object = clone $this->object; } }

$this 이용해서 clone object 자동화하기

$this에 정의된 값이 배열로 저장되는 걸 이용해서, foreach문으로 자동화한다

object(User)#3 (3) { ["name"]=> string(3) "Tim" ["age"]=> int(27) ["object"]=> object(Job)#4 (1) { ["jobname"]=> string(3) "cop" } } // 이런식으로 $this에 저장 됨


 
 

Total 77
번호 제   목 조회
공지 php 라이브러리 393
77 매직해시(MAGIC HASHES) 취약점 124
76 Trait 122
75    Trait 130
74 Overloading 128
73    Overloading 127
72 Type hinting/Type 설정하기/Throw error 125
71    Type hinting/Type 설정하기/Throw error 97
70    Type hinting/Type 설정하기/Throw error 124
69 object clone 134
68    object clone 119
67 serialize / unserialize 117
66 spl_autoload_register(오토로드) 110
65 window에서 composer깔기 119
64 Exception/try/throw/catch 125
63 Error의 종류 123
62    Error의 종류 124
61    Error의 종류 124
60 eval 124
59 Magic_methods 127
58    Magic_methods 135
 1  2  3  4  
 
개인홈페이지 덤벙닷컴은 프로그래머와 디자이너위한 IT커뮤니티 공간입니다.
Copyright ⓒ www.dumbung.com. All rights reserved.