2017-01-08 2 views
0

Частные переменные могут быть установлены таким образом:вызова 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().

Поверхностно это похоже на то, как это может работать:

Частные varaibles можно получить таким образом:

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 
Смежные вопросы