Частные переменные могут быть установлены следующим образом:
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'));
Но в моем тестировании это не сработало.
Есть идеи?
Если вы удалите &
, это работает просто отлично.
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
Других решений пока нет …