소개
약한 참조(Weak Reference)를 사용하면 객체가 소멸되는 것을 막지 않으면서도 해당 객체에 대한 참조를 유지할 수 있습니다. 이러한 특성 덕분에 캐시(cache)와 같은 구조를 구현할 때 매우 유용하게 활용됩니다.
약한 참조는 일반 참조와 비슷하지만, 결정적인 차이점이 있습니다. 바로 가비지 컬렉터(Garbage Collector)가 객체를 수거하는 것을 방해하지 않는다는 점입니다. 해당 객체를 가리키는 강한 참조(strong reference)가 더 이상 존재하지 않으면, 객체는 즉시 메모리에서 제거됩니다. 이러한 방식으로 메모리 문제 없이 캐시가 제공하는 대부분의 장점을 누릴 수 있습니다.
WeakReference 클래스는 PHP 7.4부터 도입되었습니다. 그 이전 버전에서는 weakref 확장 모듈을 통해 동일한 기능을 사용할 수 있었습니다. WeakReference 클래스의 구조는 다음과 같습니다.
문법(Syntax)
WeakReference {
/* 메서드 */
public __construct ( void )
public static create ( object $referent ) : WeakReference
public get ( void ) : ?object
}주요 메서드
public WeakReference::__construct ( void ) — WeakReference 클래스의 직접적인 인스턴스 생성을 허용하지 않습니다. 인스턴스를 만들려면 팩토리 메서드인 WeakReference::create()를 사용해야 합니다.
public static WeakReference::create ( object $referent ) : WeakReference — 새로운 약한 참조(WeakReference) 객체를 생성합니다.
public WeakReference::get ( void ) : ?object — 약하게 참조된 객체를 반환합니다. 만약 참조 대상인 객체가 이미 소멸되었다면 NULL을 반환합니다.
예제 코드
다음 예제에서는 myclass의 객체를 생성하고, 이 객체에 대한 WeakReference를 만든 뒤 get() 메서드로 확인합니다. 이 시점에는 정상적으로 객체가 하나 참조되어 출력됩니다. 이후 unset()으로 원본 객체를 제거하면, 약한 참조는 객체의 소멸을 막지 못하기 때문에 다시 호출했을 때 NULL이 반환되는 것을 확인할 수 있습니다.
<?php
class myclass{
function Hello(){
echo "Hello";
}
}
$obj = new myclass();
$ref = WeakReference::create($obj);
var_dump($ref->get());
unset($obj);
var_dump($ref->get());
?>실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
object(myclass)#1 (0) {
}
NULL