According to the manual page for setAccessible() [1] the feature is
available with 5.3.2, and I'm running

    5.3.2-1ubuntu4.5 with Suhosin-Patch (cli) (built: Sep 17 2010 13:49:46)

so I should be good to go. However, even the simplest test to make a
protected or private method accessible fails.

    php > class Foo { protected function bar() { echo "foobar\n"; } }
    php > $m = new ReflectionMethod('Foo', 'bar');
    php > $m->setAccessible(true);
    php > $foo = new Foo();
    php > $foo->bar();

    Fatal error: Call to protected method Foo::bar() from context '' in php
shell code on line 1

I've tried creating the object first, getting to the ReflectionMethod via
ReflectionClass::getMethod(), and making a public method inaccessible, but
all fail. Has anyone used this feature?

The reason I want to do this, in case anyone can suggest a work-around, is
to allow direct unit testing of protected/private methods in classes. What I
do now is have a function that eval()s a dynamic subclass with a __call()
method that proxies to protected methods. This doesn't allow testing private
methods, and it breaks if the class under test has a private/protected
constructor. I can solve the second problem with some further hacking, but
there's nothing I can do about exposing private methods temporarily.
setAccessible() seems perfectly designed to do what I need.

Thanks,
David

[1] http://php.net/manual/en/reflectionmethod.setaccessible.php

--
David Harkness
Senior Software Engineer
High Gear Media

Reply via email to