Commit 66910ee2b39 for php.net
commit 66910ee2b39c55260aae9f81203abdf2ab8869e7
Author: Jorg Adam Sowa <jorg.sowa@gmail.com>
Date: Wed Jun 24 12:44:31 2026 +0200
ext/spl: ignore leading namespace separator in spl_autoload() (#22323)
Strip a leading "\\" before lowercasing, mirroring zend_lookup_class_ex(),
so both spellings resolve identically.
diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c
index 24cd66db445..af3b115238b 100644
--- a/ext/spl/php_spl.c
+++ b/ext/spl/php_spl.c
@@ -301,7 +301,12 @@ PHP_FUNCTION(spl_autoload)
pos_len = (int)ZSTR_LEN(file_exts);
}
- lc_name = zend_string_tolower(class_name);
+ if (ZSTR_VAL(class_name)[0] == '\\') {
+ lc_name = zend_string_alloc(ZSTR_LEN(class_name) - 1, 0);
+ zend_str_tolower_copy(ZSTR_VAL(lc_name), ZSTR_VAL(class_name) + 1, ZSTR_LEN(class_name) - 1);
+ } else {
+ lc_name = zend_string_tolower(class_name);
+ }
while (pos && *pos && !EG(exception)) {
pos1 = strchr(pos, ',');
if (pos1) {
diff --git a/ext/spl/tests/spl_autoload_leading_backslash.phpt b/ext/spl/tests/spl_autoload_leading_backslash.phpt
new file mode 100644
index 00000000000..ff8ae3234ee
--- /dev/null
+++ b/ext/spl/tests/spl_autoload_leading_backslash.phpt
@@ -0,0 +1,18 @@
+--TEST--
+spl_autoload(): a leading "\" in the class name is ignored
+--FILE--
+<?php
+
+set_include_path(__DIR__);
+spl_autoload_extensions(".inc");
+
+spl_autoload("DualIterator");
+var_dump(class_exists("DualIterator", false));
+
+spl_autoload("\\RecursiveDualIterator");
+var_dump(class_exists("RecursiveDualIterator", false));
+
+?>
+--EXPECT--
+bool(true)
+bool(true)