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

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

25
задан Silver Dragon 18 August 2011 в 01:39
поделиться

5 ответов

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

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

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

50
ответ дан Brad Kent 18 August 2011 в 01:39
поделиться

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

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

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

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

14
ответ дан Gus 18 August 2011 в 01:39
поделиться

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

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

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

    return (bool) $reflection->isClosure();
}
2
ответ дан Vad.Gut 18 August 2011 в 01:39
поделиться

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

1
ответ дан Shire 18 August 2011 в 01:39
поделиться

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

// Closure
$closure = function () {}; 
$reflection = new \ReflectionFunction($closure);
// checkout if it is a closure
$test->isTrue($reflection->isClosure());
0
ответ дан jjoselon 18 August 2011 в 01:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: