객체와 참조

객체와 참조 (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