Определение, если переменная является допустимым закрытием в PHP
Используя следующую функцию:
function is_closure($t) { return ( !is_string($t) && is_callable($t)); }
Может ли это вернуться к чему-либо другому, чем анонимная функция закрытия? Если да, то каким будет правильный способ определить, является ли переменная закрытием?
Большое спасибо
Ответы
Ответ 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();
}
Ответ 4
Это поддерживается с помощью Reflection http://www.php.net/manual/en/reflectionfunctionabstract.isclosure.php
Ответ 5
Если вы получили сообщение об ошибке, не существует ReflectionFunction
, используйте обратную косую черту перед классом:
// Closure
$closure = function () {};
$reflection = new \ReflectionFunction($closure);
// checkout if it is a closure
$test->isTrue($reflection->isClosure());