Вызов fclose для приватной переменной с отражением

Частные переменные могут быть установлены следующим образом:

function setVar($obj, $var, $val)
{
    $reflection = new ReflectionClass(get_class($obj));
    $prop = $reflection->getProperty($var);
    $prop->setAccessible(true);
    return $prop->setValue($obj, $val);
}

Но это не так полезно, когда вы имеете дело с такой функцией, как fclose(),

Внешне это выглядит так:

Частные переменные могут быть доступны таким образом:

function &getVar($obj, $var)
{
    $reflection = new ReflectionClass(get_class($obj));
    $prop = $reflection->getProperty($var);
    $prop->setAccessible(true);
    return $prop->getValue($obj);
}

fclose(&$getVar($obj, 'fsock'));

Но в моем тестировании это не сработало.

Есть идеи?

1 ответ

Если вы удалите &, это работает просто отлично.

function getVar($obj, $var){
    $reflection = new ReflectionClass(get_class($obj));
    $prop = $reflection->getProperty($var);
    $prop->setAccessible(true);
    return $prop->getValue($obj);
}

Вот мой тестовый код:

class Foo{
    private $handle;
}
$foo = new Foo;

$handle = fopen(__FILE__,'rb');
if($handle){
    echo "file opened\n";
    setVar($foo, 'handle', $handle);
    if(fclose(getVar($foo, 'handle'))) echo "file closed\n";
}

Выход:

file opened
file closed
Другие вопросы по тегам