Подтвердить что ты не робот

Определение, если переменная является допустимым закрытием в PHP

Используя следующую функцию:

function is_closure($t) { return ( !is_string($t) && is_callable($t)); }

Может ли это вернуться к чему-либо другому, чем анонимная функция закрытия? Если да, то каким будет правильный способ определить, является ли переменная закрытием?

Большое спасибо

4b9b3361

Ответ 1

Наиболее детерминированный способ проверить, является ли обратный вызов фактическим закрытием:

function is_closure($t) {
    return $t instanceof Closure;
}

Все анонимные функции представлены в PHP как объекты типа Closure. (Что, возвращаясь к приведенному выше комментарию, может __invoke() к реализации __invoke().)

Ответ 2

Я думаю, вы можете использовать instanceof Closure, хотя manual утверждает, что на это не следует полагаться. Думаю, теперь это работает.

Анонимные функции в настоящее время реализованы с использованием класса Closure. Это деталь реализации, на которую нельзя положиться.

Обновление Страница руководства "Закрытие обновила свое руководство по этому вопросу. По-видимому, на это поведение теперь можно положиться.

Анонимные функции, реализованные в PHP 5.3, предоставляют объекты этого типа. Этот факт раньше считался деталью реализации, но на него теперь можно положиться.

Ответ 3

php.net предлагает использовать рефлексы, чтобы выяснить, содержит ли переменная допустимое закрытие или нет

Я использую этот маленький помощник

function isClosure($suspected_closure) {
    $reflection = new ReflectionFunction($suspected_closure);

    return (bool) $reflection->isClosure();
}

Ответ 5

Если вы получили сообщение об ошибке, не существует ReflectionFunction, используйте обратную косую черту перед классом:

// Closure
$closure = function () {}; 
$reflection = new \ReflectionFunction($closure);
// checkout if it is a closure
$test->isTrue($reflection->isClosure());