Skip to content

Commit d03d436

Browse files
authored
reflection: Fix ReflectionFunction::getShortName() for Closures (#14001)
see #13550
1 parent 2447cb2 commit d03d436

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

Zend/tests/closure_067.phpt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
--TEST--
2+
ReflectionFunction::getShortName() returns the full name for closures defined in namespaces.
3+
--FILE--
4+
<?php
5+
namespace Foo;
6+
7+
class Bar {
8+
public function baz() {
9+
return function () {
10+
11+
};
12+
}
13+
}
14+
15+
$c = (new Bar())->baz();
16+
$r = new \ReflectionFunction($c);
17+
var_dump($r->getShortName());
18+
?>
19+
--EXPECT--
20+
string(26) "{closure:Foo\Bar::baz():6}"

ext/reflection/php_reflection.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3609,10 +3609,13 @@ ZEND_METHOD(ReflectionFunctionAbstract, getShortName)
36093609
GET_REFLECTION_OBJECT_PTR(fptr);
36103610

36113611
zend_string *name = fptr->common.function_name;
3612-
const char *backslash = zend_memrchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name));
3613-
if (backslash) {
3614-
RETURN_STRINGL(backslash + 1, ZSTR_LEN(name) - (backslash - ZSTR_VAL(name) + 1));
3612+
if (!(fptr->common.fn_flags & ZEND_ACC_CLOSURE)) {
3613+
const char *backslash = zend_memrchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name));
3614+
if (backslash) {
3615+
RETURN_STRINGL(backslash + 1, ZSTR_LEN(name) - (backslash - ZSTR_VAL(name) + 1));
3616+
}
36153617
}
3618+
36163619
RETURN_STR_COPY(name);
36173620
}
36183621
/* }}} */

0 commit comments

Comments
 (0)