In a blog
post,
Matthew Weier O’Phinney pointed out that if class Derived extends
class Base, Derived can access protected properties and methods of
Base even in the case where an instance of Base is merely the
argument to some method. (I expected Derived to be able to access
$this->foo where $foo is protected, but I didn’t expect that
Derived would be able to access $obj->foo where $obj is an
argument.)
This works even if the functions are static, leading to a generic way to modify protected properties:
class Foo {
    protected $message = "jjj";
}
class Foo_Wrapper extends Foo {
    // Allows you to set both public and protected (!) properties
    static function set($obj, $property, $value) {
        $obj->{$property} = $value;
    }
    // Allows you to get both public and protected (!) properties
    static function get($obj, $property) {
        return $obj->{$property};
    }
}
$obj = new Foo();
Foo_Wrapper::set($obj, "message", "kkk");
echo Foo_Wrapper::get($obj, "message"), "\n";