객체와 참조
객체와 참조 (Objects and references)
PHP OOP에서 자주 언급되는 핵심 포인트 가운데 하나가 "객체는 기본적으로 참조로 전달된다"라는 말이에요. 그런데 이 말은 완전히 맞지는 않아요. 이 절에서는 몇 가지 예시로 이 흔한 생각을 바로잡아 볼게요.
PHP에서 참조(reference)는 별칭(alias)이라서, 서로 다른 두 변수가 같은 값을 가리키며 쓸 수 있게 해줘요. 그런데 PHP에서 객체 변수는 값으로서 객체 자체를 담고 있지 않아요. 객체 접근자가 실제 객체를 찾아갈 수 있게 해주는 객체 식별자(identifier)만 담고 있죠. 객체를 인자로 넘기거나, 반환하거나, 다른 변수에 할당할 때 그 여러 변수는 별칭이 아니에요. 각자 같은 객체를 가리키는 식별자의 복사본을 들고 있는 거예요.
예제 #1 참조와 객체 (References and Objects)
<?php
class A {
public $foo = 1;
}
$a = new A;
$b = $a; // $a and $b are copies of the same identifier
// ($a) = ($b) = <id>
$b->foo = 2;
echo $a->foo."\n";
$c = new A;
$d = &$c; // $c and $d are references
// ($c,$d) = <id>
$d->foo = 2;
echo $c->foo."\n";
$e = new A;
function foo($obj) {
// ($obj) = ($e) = <id>
$obj->foo = 2;
}
foo($e);
echo $e->foo."\n";
?>
위 예제의 출력은 다음과 같아요.
2
2
2