Получаем доступ к приватным методам и свойствам в PHP

Доступ к приватным свойствам и методам в 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

 

Теги: PHP, Closure

Комментарии (0)