Weak References
The new operator creates an object based on a class
and returns a reference to this new instance that can be assigned to
a variable. The object can then be accessed through that variable.
As long as a variable holds a reference to an object, it is kept in
memory. When no variable references an object anymore, the object
will be destroyed. This is the responsibility of PHP’s garbage
collector.
Caching in general and the Identity Map pattern in particular are use cases where it may make sense to have a variable that holds a reference to an object without having that reference prevent the object from getting destroyed by the garbage collector. This is where weak references come into play.
PHP provides the WeakReference class for storing a
weak reference to an object. The weak reference is created using the
static method WeakReference::create(), and the
referenced object can be accessed through
WeakReference::get():
$o = new stdClass;
$r = WeakReference::create($o);
var_dump(isset($o));
var_dump($o instanceof stdClass);
var_dump(isset($r));
var_dump($r->get() instanceof stdClass);
unset($o);
var_dump(isset($o));
var_dump(isset($r));
var_dump($r->get());
Executing the code shown above will print the output shown below:
bool(true)
bool(true)
bool(true)
bool(true)
bool(false)
bool(true)
NULL
WeakReference::get() returns null when
the object that is weakly referenced no longer exists.
The WeakReference class is final.
WeakReference objects cannot be serialized and no
properties can be set on them:
$o = new stdClass;
$r = WeakReference::create($o);
$r->foo = 'bar';
Executing the code shown above will print the error shown below:
Uncaught Error: WeakReference objects do not support
properties in ...
$o = new stdClass;
$r = WeakReference::create($o);
serialize($r);
Executing the code shown above will print the error shown below:
Uncaught Exception: Serialization of 'WeakReference'
is not allowed in ...