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

PHP WeakReference 클래스 완벽 정리 - 약한 참조(Weak Reference)의 개념과 활용법

소개

약한 참조(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