Skip to content

Commit c9f5702

Browse files
committed
Preserve class-name case in ReflectionClass::getProperty()
When given a "Class::property" argument, getProperty() lowercased the class part before looking it up, so the "Class ... does not exist" exception printed the lowercased name and autoloaders received it in lowercase, breaking case-sensitive (PSR-4) autoloaders. Pass the class name to zend_lookup_class() as given - it lowercases internally for the class-table lookup - matching what ReflectionMethod and ReflectionProperty already do.
1 parent a7f40d1 commit c9f5702

4 files changed

Lines changed: 25 additions & 5 deletions

File tree

ext/reflection/php_reflection.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4635,9 +4635,7 @@ ZEND_METHOD(ReflectionClass, getProperty)
46354635
str_name = ZSTR_VAL(name);
46364636
if ((tmp = strstr(ZSTR_VAL(name), "::")) != NULL) {
46374637
classname_len = tmp - ZSTR_VAL(name);
4638-
classname = zend_string_alloc(classname_len, 0);
4639-
zend_str_tolower_copy(ZSTR_VAL(classname), ZSTR_VAL(name), classname_len);
4640-
ZSTR_VAL(classname)[classname_len] = '\0';
4638+
classname = zend_string_init(ZSTR_VAL(name), classname_len, 0);
46414639
str_name_len = ZSTR_LEN(name) - (classname_len + 2);
46424640
str_name = tmp + 2;
46434641

ext/reflection/tests/ReflectionClass_getProperty_003.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,4 +244,4 @@ Fully qualified property name X::$privC does not specify a base class of C
244244
--- (Reflecting on X::doesNotExist) ---
245245
Fully qualified property name X::$doesNotExist does not specify a base class of C
246246
--- (Reflecting on doesNotexist::doesNotExist) ---
247-
Class "doesnotexist" does not exist
247+
Class "doesNotexist" does not exist

ext/reflection/tests/ReflectionClass_getProperty_004.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,4 +248,4 @@ Fully qualified property name X::$privC does not specify a base class of C
248248
--- (Reflecting on X::doesNotExist) ---
249249
Fully qualified property name X::$doesNotExist does not specify a base class of C
250250
--- (Reflecting on doesNotexist::doesNotExist) ---
251-
Class "doesnotexist" does not exist
251+
Class "doesNotexist" does not exist
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
ReflectionClass::getProperty() preserves the case of the class name in errors and autoloading
3+
--FILE--
4+
<?php
5+
class C {
6+
public $p;
7+
}
8+
9+
spl_autoload_register(function ($name) {
10+
echo "Autoloading $name\n";
11+
});
12+
13+
$rc = new ReflectionClass('C');
14+
try {
15+
$rc->getProperty("Some\\MixedCase::p");
16+
} catch (ReflectionException $e) {
17+
echo $e->getMessage(), "\n";
18+
}
19+
?>
20+
--EXPECT--
21+
Autoloading Some\MixedCase
22+
Class "Some\MixedCase" does not exist

0 commit comments

Comments
 (0)