너의 개발은/PHP

PHP: 참조 (WeakReference)

참조

참조포인터와 비슷하지만 사실 전혀 다른 개념입니다. 그저 변수의 실질적 값이 담긴 공간에 그저 이름을 하나 더 부여할 뿐입니다. hello 라는 변수에 Hello, world 라는 값이 담겨있고, 이 변수의 참조인 sayHello 라는 변수를 만들면 그저 Hello, world 라는 값이 담긴 메모리 공간에 이름이 하나 더 부여 될 뿐이라는 것입니다. 그 말은 hello 변수와 sayHello 라는 변수는 같다는 이야기로 해석할 수 있습니다.

&

& 기호를 사용하여 참조를 나타낼 수 있으며, 이는 위에서 언급한 바와 같이 이름을 하나더 부여하는 것과 같습니다. 그래서 sayHello 라는 값을 바꿨더니 hello 변수의 값도 변하는 효과가 나타난 것입니다. 포인터와 헷갈려서는 안 됩니다. 포인터는 주소값을 가지고 있는 것 뿐입니다.

$hello = 'Hello, world';
$sayHello =& $hello;

$sayHello = 'Who are you?';
var_dump($hello); // -> Who are you?

글로벌 스코프 변수

해당 이야기는 PHP: 변수에서도 잠깐 언급한 바 있으나, 참조에서 알아야 할 추가 사항이 있습니다. 바로 global 키워드로 선언한 변수가 사실은 참조라는 점입니다. global 키워드를 통해 접근한 변수를 바꾸면 전역변수의 값이 변경되는 것은 참조로서 동작하기 때문입니다.

function foo()
{
    // global $hello;
    $hello =& $GLOBALS['hello'];
    $hello = 'Bye';
}

var_dump($hello); // -> Bye

함수 매개변수

함수의 매개변수로 참조를 표현하게 되면, 신기한 것을 할 수 있습니다. 바로, 외부에서 선언되지 않은 변수를 던져주고 함수 내부에서 해당 변수에 조작을 가하게 되면, 외부에 적용된다는 것입니다. 아래의 예시에는 message 라는 변수가 선언되지 않았음에도 외부에서 전달하고 있습니다. 그러나 참조로 전달되면 이는 오류가 발생하지 않습니다.

function foo(&$message)
{
    $message = 'Hello, world';
}

foo($message);
var_dump($message); // -> Hello, world

반환하기

참조를 반환하는 경우는 많이 본 적 없지만, 반환할 수는 있습니다. 함수의 이름의 왼쪽에 & 기호를 적어주면 됩니다. 다만 남용하는 경우 코드가 지저분해질 뿐더러 버그가 발생할 가능성이 농후하므로 참조를 반환하는 행위는 가급적 하지 않는 것을 권장드립니다.

class MyClass
{
    public $message = 'Hello, world';

    public function &getMessage()
    {
        return $this->message;
    }
}

$myclass = new MyClass();

$sayHello =& $myclass->getMessage();
$sayHello = 'Bye';

var_dump($myclass->message); // -> Bye

삭제하기

두 개의 변수가 참조로 링크된 상태에서 하나를 unset 처리한다고 해서 다른 참조까지 사라지지는 않습니다.

$sayHello =& $hello;
unset($sayHello);

var_dump($hello); // -> Who are you?

WeakReference

WeakReference빌트인 클래스입니다. 연결된 원본 객체를 삭제하면 약한 참조는 NULL 로 바뀌는 것을 볼 수 있습니다. 마치 Cache 같이 사용할 수 있는데, 저장소가 WeakReference 의 인스턴스라는 점만 다를 뿐, 원본 객체가 날라갔을 때 NULL 이 나오고 있으므로, 캐시가 있는지 검사하려니, 캐시 미스가 뜨는 격이죠.

$class = new stdClass();
$weakRef = WeakReference::create($class);
var_dump($weakRef->get()); // -> class stdClass#1 (0) {}

unset($class);

var_dump($weakRef->get()); // -> NULL

 

 

PHP 7+ 프로그래밍: 리부트 - 인프런

기초 문법부터 내장 함수, 웹 보안, 게시판 만들기까지 PHP 언어를 시작하는 분들을 위해 바이블이 될 수 있게 만들어보고자 하는 마음으로 이번 강좌를 만들어보았습니다. 입문 웹 개발 프로그��

www.inflearn.com

 

PHP 7+ 프로그래밍: 객체지향 - 인프런

PHP 객체지향, 내장 클래스, PSR, Composer, MVC(Model, View, Controller)까지 모던 PHP를 익히기 위한 근간을 이야기합니다. 초급 프로그래밍 언어 알고리즘 PHP 객체지향 알고리즘 온라인 강의 모던 PHP 프로��

www.inflearn.com

'너의 개발은 > PHP' 카테고리의 다른 글

PHP: HTML 폼 (GET, POST)  (0) 2020.04.29
PHP: 객체 비교와 복사  (0) 2020.04.25
PHP: 참조 (WeakReference)  (0) 2020.04.25
PHP: 제네레이터 (Iterator)  (0) 2020.04.24
PHP: 에러와 예외 (try, catch, finally)  (1) 2020.04.23
PHP: 네임스페이스  (0) 2020.04.22