Когда вы создаете метод, который возвращает замыкание в PHP:
class ExampleClass {
public function test() {
$example = 10;
return function() use ($example) {
return $example;
};
}
}
Результат print_r
содержит this
(класс, чей метод создал замыкание) и static
, который представляется значениями, связанными с use ()
заявление о закрытии:
$instance = new ExampleClass();
$closure = $instance->test();
print_r($closure);
Производство:
Closure Object (
[static] => Array (
[example] => 10
)
[this] => ExampleClass Object()
)
Однако я не могу за всю жизнь понять, как запечатлеть эти ценности. Невозможно использовать любую форму доступа к свойству (например, $closure->static
или же $closure->{'static'}
) без получения следующего:
Неустранимая ошибка PHP: необработанная ошибка: объект закрытия не может иметь свойства в XYZ.
Обозначение доступа к массиву, очевидно, тоже не работает:
Неустранимая ошибка PHP: необработанная ошибка: невозможно использовать объект типа Closure в качестве массива в XYZ.
JSON-кодирование объекта, кроме того, что делает значения бесполезными, если они являются объектами, предоставляет пустой JSON-объект {}
и используя ReflectionFunction
класс не предоставляет доступ к этим элементам.
закрытие документация также не предоставляет никаких средств доступа к этим значениям.
Вне того, чтобы делать что-то постыдное, например, буферизацию и анализ выходных данных print_r
или что-то подобное, я не вижу способа получить эти значения.
Я что-то упускаю из виду?
Замечания: Вариант использования предназначен для реализации запоминания, и эти значения будут чрезвычайно полезны для определения того, соответствует ли вызов предыдущему кэшированному вызову.
Кажется, вы могли пропустить некоторые из ReflectionFunction
методы.
Посмотрите на ReflectionFunction::getClosureThis()
метод. Я выследил это, просматривая исходный код PHP 7, выполняя поиск zend_get_closure_this_ptr()
который определен в zend_closures.c
.
Руководство в настоящее время не имеет много документации для этой функции. Я использую 7.0.9; попробуйте запустить этот код на основе вашего примера:
class ExampleClass {
private $testProperty = 33;
public function test() {
$example = 10;
return function() use ($example) {
return $example;
};
}
}
$instance = new ExampleClass();
$closure = $instance->test();
print_r($closure);
$func = new ReflectionFunction($closure);
print_r($func->getClosureThis());
Вы должны получить вывод, аналогичный
Closure Object
(
[static] => Array
(
[example] => 10
)
[this] => ExampleClass Object
(
[testProperty:ExampleClass:private] => 33
)
)
ExampleClass Object
(
[testProperty:ExampleClass:private] => 33
)
Что касается статических переменных замыкания, они возвращаются с ReflectionFunction::getStaticVariables()
:
php > var_dump($func->getStaticVariables());
array(1) {
["example"]=>
int(10)
}
Других решений пока нет …