Чтение & quot; это & ​​quot; и & quot; использовать & quot; аргументы из закрытия PHP

Когда вы создаете метод, который возвращает замыкание в 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 или что-то подобное, я не вижу способа получить эти значения.

Я что-то упускаю из виду?

Замечания: Вариант использования предназначен для реализации запоминания, и эти значения будут чрезвычайно полезны для определения того, соответствует ли вызов предыдущему кэшированному вызову.

2

Решение

Кажется, вы могли пропустить некоторые из 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)
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector