Weakref::valid
(PECL weakref >= 0.1.0)
Weakref::valid — Checks whether the object referenced still exists
Description
public bool Weakref::valid
( void
)
Checks whether the object referenced still exists.
Parameters
This function has no parameters.
Return Values
Returns TRUE
if the object still exists and is thus still accessible via
Weakref::get(), FALSE
otherwise.
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Изменение поведения PHP
- Weak References
- Функция Weakref::acquire() - Acquires a strong reference on that object
- Функция Weakref::__construct() - Constructs a new weak reference
- Функция Weakref::get() - Returns the object pointed to by the weak reference
- Функция Weakref::release() - Releases a previously acquired reference
- Функция Weakref::valid() - Checks whether the object referenced still exists
Коментарии
Beware that the "valid()" method should not be used to check the availability of an object before calling "get()". Indeed, the garbage collector might be triggered between the call to "valid()" and the call to "get()".
<?php
if ($weakRef->valid()) { // Returns true because the object is not yet garbage collected
// If you are not lucky, the garbage collector might be triggered here
$obj = $weakRef->get(); // Returns null
$obj->doSomeStuff(); // Boom!
}
?>
So instead, you should always call "get()" directly:
<?php
$obj = $weakRef->get();
if ($obj !== null) {
$obj->doSomeStuff(); // This is 100% accurate
}
?>
Generally speaking, the "valid()" method is tricky because a call to it might return true and the next call might return false (you never know when the garbage collector will be trigerred). However, testing for invalidity works reliably.
<?php
if ($weakRef->valid()) {
// At this point, you are not sure that the object is still there (garbage collector might have collected it)
}
if (!$weakRef->valid()) {
// At this point, you are sure the object is gone.
}
?>