Определение, является ли переменная допустимым закрытием в PHP - PullRequest
25 голосов
/ 18 августа 2011

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

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

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

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

Ответы [ 5 ]

49 голосов
/ 18 августа 2011

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

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

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

14 голосов
/ 18 августа 2011

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

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

Обновление Страница справочника Closure обновила свое руководство по этому вопросу.Похоже, что на это поведение теперь можно положиться.

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

2 голосов
/ 10 августа 2016

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

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

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

    return (bool) $reflection->isClosure();
}
1 голос
/ 03 февраля 2014

Это поддерживается с отражением http://www.php.net/manual/en/reflectionfunctionabstract.isclosure.php

0 голосов
/ 05 июня 2017

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

// Closure
$closure = function () {}; 
$reflection = new \ReflectionFunction($closure);
// checkout if it is a closure
$test->isTrue($reflection->isClosure());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...