Получаем доступ к приватным методам и свойствам в PHP
При использовании сторонних библиотек бывает необходимо исправить логику работы определенных её частей или же в ней не хватает необходимого Вам функционала. Конечно хорошим решением является расширение функционала библиотеки и отправка Pull Request автору. Однако далеко не все на них реагируют, а если и реагируют, то достаточно долго. При попытке исправить ситуацию своими силами, не вмешиваясь в библиотеку можно столкнуться с тем, что автор закрыл доступ к свойствам не позаботившисть об открытом методе для получения значения свойства(getter). Эту проблему можно решить относительно легко с помощью замыкания и не прибегая к Reflection.
Начиная с PHP 5.4, замыкания получили методы, позволяющие контролировать анонимные функции после их создания. Нас, в первую очередь, интересует метод call, который связывает замыкание с контекстом выполнения, и вызывает его с заданными параметрами.
Итак, если у нас PHP 5.4 или выше и есть экземпляр объекта, то мы без проблем можем получить доступ к закрытым свойствам и методам, например так:
<?php
// Наш подопытный с закрытыми свойствами/методами
class Foo
{
private $test = 'TEST OK';
private function testFunc($param = '')
{
echo "Foo {$param}\n";
}
}
// Берем экземпляр объекта подопытного
$foo = new Foo();
// Создаем замыкание, которое вызовет приватный метод
// и вернет значение приватного свойства
$closure = function () {
$this->testFunc('!!!');
return $this->test;
};
// Выполняем замыкание, переопределив контекст выполнения
echo $closure->call($foo) . PHP_EOL;
Результат выполнения:
Foo !!!
TEST OK
Комментарии (0)