Используя следующую функцию:
function is_closure($t) { return ( !is_string($t) && is_callable($t)); }
Может ли это вернуться для чего-либо еще, чем анонимная функция закрытия? Если да, то каков был бы правильный способ определить, является ли переменная закрытием?
Большое спасибо
Самый детерминированный способ проверить, является ли обратный вызов фактическим закрытием:
function is_closure($t) { return is_object($t) && ($t instanceof Closure); }
Все анонимные функции представлены как объекты типа Closure
в PHP. (Который, возвращаясь к предыдущему комментарию, реализует метод __invoke()
.)
Я думаю, вы можете использовать instanceof Closure
хотя в руководстве указано, что на это не следует полагаться. Наверное, сейчас это работает.
Анонимные функции в настоящее время реализованы с использованием класса Closure. Это деталь реализации, на которую нельзя положиться.
Обновление Страница руководства по закрытию обновила свои рекомендации по этому вопросу. Похоже, на это поведение теперь можно положиться.
Анонимные функции, реализованные в PHP 5.3, предоставляют объекты этого типа. Этот факт раньше считался деталью реализации, но теперь его можно использовать.
Это поддерживается Reflection http://www.php.net/manual/en/reflectionfunctionabstract.isclosure.php
php.net предлагает использовать рефлексы, чтобы выяснить, содержит ли переменная действительное закрытие или нет
Я использую этот маленький помощник
function isClosure($suspected_closure) { $reflection = new ReflectionFunction($suspected_closure); return (bool) $reflection->isClosure(); }
Если вы получите сообщение об ошибке, которое не существует ReflectionFunction
, используйте обратную косую черту перед классом:
// Closure $closure = function () {}; $reflection = new \ReflectionFunction($closure); // checkout if it is a closure $test->isTrue($reflection->isClosure());