【发布时间】:2016-10-15 11:04:41
【问题描述】:
我需要测试我的抽象类是否可以正确地从受保护的方法返回对内部数组的引用。测试受保护方法的唯一方法是通过反射。但是,ReflectionMethod::invokeArgs() 返回的引用似乎是不可能的。还是我在这里做错了什么?
class A
{
protected $items;
protected function &_getItemStorage()
{
return $this->items;
}
}
function &reflectionInvokeByRef($object, $method, $args = array())
{
$reflection = new \ReflectionMethod($object, $method);
$reflection->setAccessible(true);
$result = &$reflection->invokeArgs($object, $args);
return $result;
}
$a = new A();
$items = &reflectionInvokeByRef($a, '_getItemStorage');
这会导致以下错误:
Only variables should be assigned by reference
在线:$result = &$reflection->invokeArgs($object, $args);
当试图通过引用分配函数的返回值时,通常会抛出此错误,而函数未声明为通过引用返回。 使我的功能无法使用任何已知方法进行测试。
【问题讨论】:
-
我认为您只需要按位调用 $reflection 即可,因为您已经在函数中返回了引用。能贴一下invokeArgs函数的代码吗?
-
我不能,因为该函数在 C 中。但是在问题的开头有一个指向该函数文档的链接。这些文档还声明您确实需要包含
&,顺便说一下,它不是按位运算符,而是表示“引用。在这种情况下,它表明我正在分配引用,而不是参考值。
标签: php unit-testing reflection reference