Access private members of parent classes; playing with the scopes:
classParentsextendsGrandparents{ private$__status2='divorced'; }
classMeextendsParents{ private$__status3='single'; }$status1_3= function()
{$this->__status1='happy';$this->__status2='happy';$this->__status3='happy';
};$status1_2= function()
{$this->__status1='happy';$this->__status2='happy';
};// test 1:$c=$status1_3->bindTo($R= newMe,Parents::class);#$c(); // Fatal: Cannot access private property Me::$__status3
// test 2:$d=$status1_2->bindTo($R= newMe,Parents::class);$d();var_dump($R);/*
object(Me)#5 (4) {
["__status3":"Me":private]=>
string(6) "single"
["__status2":"Parents":private]=>
string(5) "happy"
["__status1":"Grandparents":private]=>
string(7) "married"
["__status1"]=>
string(5) "happy"
}
*/
// test 3:$e=$status1_3->bindTo($R= newMe,Grandparents::class);#$e(); // Fatal: Cannot access private property Me::$__status3
// test 4:$f=$status1_2->bindTo($R= newMe,Grandparents::class);$f();var_dump($R);/*
object(Me)#9 (4) {
["__status3":"Me":private]=>
string(6) "single"
["__status2":"Parents":private]=>
string(8) "divorced"
["__status1":"Grandparents":private]=>
string(5) "happy"
["__status2"]=>
string(5) "happy"
}
*/?>
Clear the stack trace:
useReflectionException;$c= function()
{$this->trace= [];
};$c=$c->bindTo($R= newReflectionException,Exception::class);$c();
try
{
throw$R;
}
catch(ReflectionException $R)
{var_dump($R->getTrace());
}/*
array(0) {
}
*/?>