Вызвать private метод класса в PHP
25 мая 2015
Бывает, не хочется портить API ради тестирования, но нужно как-то добраться до private метода. Сделать это можно вот так:
function callPrivateMethod($object, $method, $args) { $classReflection = new \ReflectionClass(get_class($object)); $methodReflection = $classReflection->getMethod($method); $methodReflection->setAccessible(true); $result = $methodReflection->invokeArgs($object, $args); $methodReflection->setAccessible(false); return $result; } $myObject = new MyClass(); callPrivateMethod($myObject, 'hello', ['world']);
Комментарии RSS по email OK
Если метод private или protected, то скорее всего он вызывается в другом каком-то методе имеющий доступ public. И тестировать его следует именно через открытый метод. Рефлексировать в любой непонятной ситуации -- гон.
Павел, а если это какой-нибудь внутренний счетчик для которого не хочется делать геттер чтобы код не разрастался?
Ведь так же можно и до всяких приватных переменных добираться что может быть удобно
Павел, ситуация следующая: открытый метод на основе доступности PECL-расширения выбирает, использовать ли это расширение или же откатиться на fallback-метод, написанный на PHP. Открывать этот fallback-метод смысла никакого нет. Прогонять два PHP: с расширением и без, не хочется.
Не, ребят, я понимаю, что есть исключительные ситуации когда без рефлексии никак. Я вел к тому, что не стоит ее юзать всегда и где ни попадя.
Ещё вариант, с версий где есть call у Closure 3v4l.org/abZ3Y
А всякие моки не рефлексию мучают случем? :)
Roman, только php7 ?
Ошибочка
Поправил.
А для чего $result?
Хе-хе. Добавил return.
Klay, моки (в PHPUnit) генерируют код для класса-обертки, а потом его eval'ят.
Можно еще вместо
использовать
Остальные операции такие же.