Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 객체와 참조 완벽 이해 – 객체 변수의 실제 동작 원리

PHP 객체와 참조의 기본 개념

PHP에서는 객체가 기본적으로 참조(by reference) 방식으로 전달됩니다. 여기서 말하는 '참조'란 별칭(alias)을 의미하며, 서로 다른 두 변수가 동일한 값을 공유할 수 있게 해주는 메커니즘입니다.

흥미로운 점은 객체 변수에는 객체 자체가 값으로 저장되지 않는다는 것입니다. 대신 객체 식별자(object identifier)만을 담고 있으며, 이 식별자를 통해 실제 객체에 접근하게 됩니다.

따라서 객체가 함수의 인수로 전달되거나, 반환되거나, 다른 변수에 할당될 때 각각의 변수들은 서로의 별칭이 아니라 동일한 객체를 가리키는 식별자의 복사본을 갖게 됩니다.

spl_object_hash()로 객체 식별자 확인하기

PHP는 spl_object_hash() 함수를 제공합니다. 이 함수는 각 객체마다 고유한 해시 ID를 반환하므로, 여러 변수가 같은 객체를 가리키고 있는지 손쉽게 확인할 수 있습니다.

아래 예제에서는 하나의 객체를 생성한 후 두 번째 변수에 할당하고, 각 변수의 해시 ID를 출력해 봅니다.

<?php
class test1 {
    public $name;
}

$obj1 = new test1();
echo "ID of obj1: " . spl_object_hash($obj1) . "\n";

$obj2 = $obj1;
echo "ID of obj2: " . spl_object_hash($obj2);
?>

실행 결과

두 변수 모두 동일한 객체를 가리키고 있으므로, 같은 ID가 출력되는 것을 확인할 수 있습니다.

ID of obj1: 000000004355dda6000000006f04b1a7
ID of obj2: 000000004355dda6000000006f04b1a7

참조 연산자(&)를 사용하는 경우

이번에는 변수 이름 앞에 & 기호를 붙여 명시적인 참조를 만들어 보겠습니다. 이렇게 하면 한쪽 변수에서 프로퍼티(속성)를 변경했을 때, 그 변경 사항이 참조 변수에 자동으로 반영됩니다.

<?php
class test1 {
    public $name;
}

$obj1 = new test1();
echo "ID of obj1: " . spl_object_hash($obj1) . "\n";

$obj2 =& $obj1;
echo "ID of obj2: " . spl_object_hash($obj2) . "\n";

$obj1->name = "Amar";
echo "name: " . $obj2->name;
?>

실행 결과

$obj1의 name 속성만 변경했음에도, $obj2를 통해 조회했을 때 변경된 값이 그대로 출력됩니다.

ID of obj1: 00000000163cf0b8000000003ad0ed93
ID of obj2: 00000000163cf0b8000000003ad0ed93
name: Amar

정리

PHP 5부터는 객체를 단순히 할당($obj2 = $obj1)만 해도 두 변수가 같은 객체를 공유합니다. 따라서 객체에 대해 명시적 참조(&)를 사용하는 것은 일반적으로 불필요하며, 참조 연산자는 주로 스칼라 변수나 배열에서 유용하게 활용됩니다. spl_object_hash() 함수를 사용하면 변수들이 실제로 어떤 객체를 가리키는지 코드 실행 중에 쉽게 검증할 수 있으므로, 참조 관련 로직을 디버깅할 때 매우 유용한 도구입니다.