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