Это очень краткий случай в PHP 5.4 относительно передачи объектов по ссылке, где вы получите эту ошибку:
PHP Warning: Parameter 1 to A::foo() expected to be a reference, value given
Но только как составной эффект:
- Использование отражения для установки унаследованного метода как "доступного",
- И этот метод принимает явно ссылочный аргумент (& аргумент sig)
- И затем вызывать его с помощью func_get_args(), а не конструировать массив аргументов вручную.
Не знаю, почему все это вызывает такое поведение или если они должны.
Важно отметить, что этого эффекта нет в PHP 5.5.
Это код, который вызовет указанную выше ошибку, но если вы прокомментируете строку с помощью COMMENT THIS LINE
, код будет работать нормально (например, объект правильно передается функции foo):
class A {
private function foo(&$arg1) {
var_dump('arg1: ', $arg1);
}
}
class B extends A {
public function bar() {
$x = new stdClass();
$x->baz = 'just a value';
$this->callPrivate($x);
}
private function callPrivate($x)
{
$method = new \ReflectionMethod(
'A',
'foo'
);
//* for some reason, the private function needs to have been changed to be 'accessible' for this to work in 5.4
$method->setAccessible(true);
//working 5.4 (* see above) but not in 5.5
$arguments = func_get_args();
//not working in either
$arguments = array($x); // <---- COMMENT THIS LINE TO SEE IT WORK IN PHP 5.4
return $method->invokeArgs($this, $arguments);
}
}
$y = new B();
$y->bar();
Я не понимаю, почему бы не было разницы между двумя массивами $arguments, поскольку var_dumping их показывает один и тот же вывод. Поэтому я полагаю, что это связано с чем-то более низким уровнем, например, объектные "указатели" различаются (из моей глубины здесь)?
Другой вопрос: если это ошибка в PHP 5.4, 5.5 или оба?