diff --git a/Zend/tests/closure_067.phpt b/Zend/tests/closure_067.phpt new file mode 100644 index 0000000000000..2738959509d7a --- /dev/null +++ b/Zend/tests/closure_067.phpt @@ -0,0 +1,20 @@ +--TEST-- +ReflectionFunction::getShortName() returns the full name for closures defined in namespaces. +--FILE-- +baz(); +$r = new \ReflectionFunction($c); +var_dump($r->getShortName()); +?> +--EXPECT-- +string(26) "{closure:Foo\Bar::baz():6}" diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 314a0359d3fc7..d2be2f869ae20 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3609,10 +3609,13 @@ ZEND_METHOD(ReflectionFunctionAbstract, getShortName) GET_REFLECTION_OBJECT_PTR(fptr); zend_string *name = fptr->common.function_name; - const char *backslash = zend_memrchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name)); - if (backslash) { - RETURN_STRINGL(backslash + 1, ZSTR_LEN(name) - (backslash - ZSTR_VAL(name) + 1)); + if (!(fptr->common.fn_flags & ZEND_ACC_CLOSURE)) { + const char *backslash = zend_memrchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name)); + if (backslash) { + RETURN_STRINGL(backslash + 1, ZSTR_LEN(name) - (backslash - ZSTR_VAL(name) + 1)); + } } + RETURN_STR_COPY(name); } /* }}} */