From 20682176e48136ed3ed90b6502e4e0701aa31076 Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Sat, 27 Dec 2025 17:39:38 +0800 Subject: [PATCH 01/17] support \f in `trim`, `rtrim` and `ltrim` --- ext/standard/basic_functions.stub.php | 8 ++++---- ext/standard/string.c | 8 ++++---- tests/classes/tostring_001.phpt | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index e27dca069c55b..fb1e6277b73ab 100644 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -2310,16 +2310,16 @@ function strcoll(string $string1, string $string2): int {} * @frameless-function {"arity": 1} * @frameless-function {"arity": 2} */ -function trim(string $string, string $characters = " \n\r\t\v\0"): string {} +function trim(string $string, string $characters = " \f\n\r\t\v\0"): string {} /** @compile-time-eval */ -function rtrim(string $string, string $characters = " \n\r\t\v\0"): string {} +function rtrim(string $string, string $characters = " \f\n\r\t\v\0"): string {} /** @alias rtrim */ -function chop(string $string, string $characters = " \n\r\t\v\0"): string {} +function chop(string $string, string $characters = " \f\n\r\t\v\0"): string {} /** @compile-time-eval */ -function ltrim(string $string, string $characters = " \n\r\t\v\0"): string {} +function ltrim(string $string, string $characters = " \f\n\r\t\v\0"): string {} /** * @compile-time-eval diff --git a/ext/standard/string.c b/ext/standard/string.c index 0b7d5be1a2576..3455379f0f468 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -519,7 +519,7 @@ static inline zend_result php_charmask(const unsigned char *input, size_t len, c * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') */ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char *what, size_t what_len, int mode) { @@ -576,7 +576,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*start; if (c <= ' ' && - (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { start++; } else { break; @@ -588,7 +588,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*(end-1); if (c <= ' ' && - (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { end--; } else { break; @@ -611,7 +611,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') */ PHPAPI zend_string *php_trim(zend_string *str, const char *what, size_t what_len, int mode) { diff --git a/tests/classes/tostring_001.phpt b/tests/classes/tostring_001.phpt index e9ef7b4175832..ffbd7692727de 100644 --- a/tests/classes/tostring_001.phpt +++ b/tests/classes/tostring_001.phpt @@ -12,7 +12,7 @@ class test2 function __toString() { echo __METHOD__ . "()\n"; - return "Converted\n"; + return "\fConverted\n"; } } From c71ffe83e1da36484e5a1b13efb3d84f9e1b235e Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Sat, 27 Dec 2025 17:53:07 +0800 Subject: [PATCH 02/17] do not touch php_trim --- ext/standard/string.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 3455379f0f468..0b7d5be1a2576 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -519,7 +519,7 @@ static inline zend_result php_charmask(const unsigned char *input, size_t len, c * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') */ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char *what, size_t what_len, int mode) { @@ -576,7 +576,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*start; if (c <= ' ' && - (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { start++; } else { break; @@ -588,7 +588,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*(end-1); if (c <= ' ' && - (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { end--; } else { break; @@ -611,7 +611,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') */ PHPAPI zend_string *php_trim(zend_string *str, const char *what, size_t what_len, int mode) { From 99b9b3392822a9756ab203ae255fffea5e162a66 Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Sat, 27 Dec 2025 18:16:49 +0800 Subject: [PATCH 03/17] For sure we need to touch php_trim XD --- ext/standard/string.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 0b7d5be1a2576..3455379f0f468 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -519,7 +519,7 @@ static inline zend_result php_charmask(const unsigned char *input, size_t len, c * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') */ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char *what, size_t what_len, int mode) { @@ -576,7 +576,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*start; if (c <= ' ' && - (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { start++; } else { break; @@ -588,7 +588,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*(end-1); if (c <= ' ' && - (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { end--; } else { break; @@ -611,7 +611,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') */ PHPAPI zend_string *php_trim(zend_string *str, const char *what, size_t what_len, int mode) { From 75c7719743b823089bd90031c5ce21d153c29d0f Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Sat, 7 Mar 2026 22:25:11 +0800 Subject: [PATCH 04/17] fix test --- ext/standard/basic_functions.stub.php | 8 ++++---- ext/standard/string.c | 8 ++++---- tests/classes/tostring_001.phpt | 17 +++++++++++++++-- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index fb1e6277b73ab..e27dca069c55b 100644 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -2310,16 +2310,16 @@ function strcoll(string $string1, string $string2): int {} * @frameless-function {"arity": 1} * @frameless-function {"arity": 2} */ -function trim(string $string, string $characters = " \f\n\r\t\v\0"): string {} +function trim(string $string, string $characters = " \n\r\t\v\0"): string {} /** @compile-time-eval */ -function rtrim(string $string, string $characters = " \f\n\r\t\v\0"): string {} +function rtrim(string $string, string $characters = " \n\r\t\v\0"): string {} /** @alias rtrim */ -function chop(string $string, string $characters = " \f\n\r\t\v\0"): string {} +function chop(string $string, string $characters = " \n\r\t\v\0"): string {} /** @compile-time-eval */ -function ltrim(string $string, string $characters = " \f\n\r\t\v\0"): string {} +function ltrim(string $string, string $characters = " \n\r\t\v\0"): string {} /** * @compile-time-eval diff --git a/ext/standard/string.c b/ext/standard/string.c index 3455379f0f468..676bd84fcbf3e 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -519,7 +519,7 @@ static inline zend_result php_charmask(const unsigned char *input, size_t len, c * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') */ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char *what, size_t what_len, int mode) { @@ -576,7 +576,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*start; if (c <= ' ' && - (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\f' || c == '\0')) { start++; } else { break; @@ -588,7 +588,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*(end-1); if (c <= ' ' && - (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\f' || c == '\0')) { end--; } else { break; @@ -611,7 +611,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') */ PHPAPI zend_string *php_trim(zend_string *str, const char *what, size_t what_len, int mode) { diff --git a/tests/classes/tostring_001.phpt b/tests/classes/tostring_001.phpt index ffbd7692727de..ae9960b66e1cc 100644 --- a/tests/classes/tostring_001.phpt +++ b/tests/classes/tostring_001.phpt @@ -12,7 +12,7 @@ class test2 function __toString() { echo __METHOD__ . "()\n"; - return "\fConverted\n"; + return "Converted\n"; } } @@ -24,6 +24,16 @@ class test3 return []; } } + +class test4 +{ + function __toString() + { + echo __METHOD__ . "()\n"; + return "\fConverted"; + } +} + echo "====test1====\n"; $o = new test1; print_r($o); @@ -77,7 +87,8 @@ try { } catch (Error $e) { echo $e->getMessage(), "\n"; } - +echo "====test11====\n"; +print $o; ?> ====DONE==== --EXPECT-- @@ -132,4 +143,6 @@ object(test3)#2 (0) { } test3::__toString() test3::__toString(): Return value must be of type string, array returned +====test11==== +Converted ====DONE==== From bb21510f1e14815c635fedcdca7fe6265cd2977b Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Sat, 7 Mar 2026 22:25:11 +0800 Subject: [PATCH 05/17] fix test --- ext/standard/basic_functions.stub.php | 8 ++++---- ext/standard/string.c | 8 ++++---- tests/classes/tostring_001.phpt | 19 +++++++++++++++++-- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index fb1e6277b73ab..e27dca069c55b 100644 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -2310,16 +2310,16 @@ function strcoll(string $string1, string $string2): int {} * @frameless-function {"arity": 1} * @frameless-function {"arity": 2} */ -function trim(string $string, string $characters = " \f\n\r\t\v\0"): string {} +function trim(string $string, string $characters = " \n\r\t\v\0"): string {} /** @compile-time-eval */ -function rtrim(string $string, string $characters = " \f\n\r\t\v\0"): string {} +function rtrim(string $string, string $characters = " \n\r\t\v\0"): string {} /** @alias rtrim */ -function chop(string $string, string $characters = " \f\n\r\t\v\0"): string {} +function chop(string $string, string $characters = " \n\r\t\v\0"): string {} /** @compile-time-eval */ -function ltrim(string $string, string $characters = " \f\n\r\t\v\0"): string {} +function ltrim(string $string, string $characters = " \n\r\t\v\0"): string {} /** * @compile-time-eval diff --git a/ext/standard/string.c b/ext/standard/string.c index 3455379f0f468..676bd84fcbf3e 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -519,7 +519,7 @@ static inline zend_result php_charmask(const unsigned char *input, size_t len, c * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') */ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char *what, size_t what_len, int mode) { @@ -576,7 +576,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*start; if (c <= ' ' && - (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\f' || c == '\0')) { start++; } else { break; @@ -588,7 +588,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char unsigned char c = (unsigned char)*(end-1); if (c <= ' ' && - (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\f' || c == '\0')) { end--; } else { break; @@ -611,7 +611,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char * mode 1 : trim left * mode 2 : trim right * mode 3 : trim left and right - * what indicates which chars are to be trimmed. NULL->default (' \f\t\n\r\v\0') + * what indicates which chars are to be trimmed. NULL->default (' \t\n\r\v\0') */ PHPAPI zend_string *php_trim(zend_string *str, const char *what, size_t what_len, int mode) { diff --git a/tests/classes/tostring_001.phpt b/tests/classes/tostring_001.phpt index ffbd7692727de..00e0ede381b25 100644 --- a/tests/classes/tostring_001.phpt +++ b/tests/classes/tostring_001.phpt @@ -12,7 +12,7 @@ class test2 function __toString() { echo __METHOD__ . "()\n"; - return "\fConverted\n"; + return "Converted\n"; } } @@ -24,6 +24,16 @@ class test3 return []; } } + +class test4 +{ + function __toString() + { + echo __METHOD__ . "()\n"; + return "Converted\f"; + } +} + echo "====test1====\n"; $o = new test1; print_r($o); @@ -77,7 +87,9 @@ try { } catch (Error $e) { echo $e->getMessage(), "\n"; } - +echo "====test11====\n"; +$o = new test4(); +var_dump(trim($o)); ?> ====DONE==== --EXPECT-- @@ -132,4 +144,7 @@ object(test3)#2 (0) { } test3::__toString() test3::__toString(): Return value must be of type string, array returned +====test11==== +test4::__toString() +string(9) "Converted" ====DONE==== From f0818cce89caa167a7689eae77478fc5b27cc47c Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Sat, 7 Mar 2026 22:52:38 +0800 Subject: [PATCH 06/17] refactor using zend_always_inline --- ext/standard/string.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index 3455379f0f468..9663ac489e9d2 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -515,6 +515,11 @@ static inline zend_result php_charmask(const unsigned char *input, size_t len, c } /* }}} */ +static zend_always_inline bool php_is_whitespace(unsigned char c) +{ + return c <= ' ' && (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0'); +} + /* {{{ php_trim_int() * mode 1 : trim left * mode 2 : trim right @@ -573,10 +578,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char } else { if (mode & 1) { while (start != end) { - unsigned char c = (unsigned char)*start; - - if (c <= ' ' && - (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + if (php_is_whitespace((unsigned char)*start)) { start++; } else { break; @@ -585,10 +587,7 @@ static zend_always_inline zend_string *php_trim_int(zend_string *str, const char } if (mode & 2) { while (start != end) { - unsigned char c = (unsigned char)*(end-1); - - if (c <= ' ' && - (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v' || c == '\0')) { + if (php_is_whitespace((unsigned char)*(end-1))) { end--; } else { break; From 25cd0baa78114f4fb68b6f72ce29ae5dee0aa320 Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Sat, 7 Mar 2026 23:39:19 +0800 Subject: [PATCH 07/17] Update NEWS --- NEWS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS b/NEWS index 12740c65c3c89..11d10a70f366e 100644 --- a/NEWS +++ b/NEWS @@ -71,6 +71,8 @@ PHP NEWS - Standard: . Fixed bug GH-19926 (reset internal pointer earlier while splicing array while COW violation flag is still set). (alexandre-daubois) + . Added form feed (\f) in the default trimmed characters of trim(), rtrim() + and ltrim(). (Weilin Du, LamentXU) - Streams: . Added so_reuseaddr streams context socket option that allows disabling From 2c3328818431ae3027c669e49093347d455fc5ff Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Sun, 8 Mar 2026 12:20:55 +0800 Subject: [PATCH 08/17] Update basic_functions.stub.php --- ext/standard/basic_functions.stub.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index e27dca069c55b..fb1e6277b73ab 100644 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -2310,16 +2310,16 @@ function strcoll(string $string1, string $string2): int {} * @frameless-function {"arity": 1} * @frameless-function {"arity": 2} */ -function trim(string $string, string $characters = " \n\r\t\v\0"): string {} +function trim(string $string, string $characters = " \f\n\r\t\v\0"): string {} /** @compile-time-eval */ -function rtrim(string $string, string $characters = " \n\r\t\v\0"): string {} +function rtrim(string $string, string $characters = " \f\n\r\t\v\0"): string {} /** @alias rtrim */ -function chop(string $string, string $characters = " \n\r\t\v\0"): string {} +function chop(string $string, string $characters = " \f\n\r\t\v\0"): string {} /** @compile-time-eval */ -function ltrim(string $string, string $characters = " \n\r\t\v\0"): string {} +function ltrim(string $string, string $characters = " \f\n\r\t\v\0"): string {} /** * @compile-time-eval From 229b671a032f6fac5e585ba4a4c4d0f5e6f6c206 Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Sun, 8 Mar 2026 13:00:11 +0800 Subject: [PATCH 09/17] fix stub --- ext/standard/basic_functions_arginfo.h | 4 ++-- ext/standard/basic_functions_decl.h | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index e467710f72f91..d0109fa27c960 100644 --- a/ext/standard/basic_functions_arginfo.h +++ b/ext/standard/basic_functions_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit basic_functions.stub.php instead. - * Stub hash: 8d1c2a735f412f8571675c6b025c3a418b68fb65 + * Stub hash: f5583557f058e4862750d1262296d7f59cb0eed0 * Has decl header: yes */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) @@ -839,7 +839,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_trim, 0, 1, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, string, IS_STRING, 0) - ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, characters, IS_STRING, 0, "\" \\n\\r\\t\\v\\x00\"") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, characters, IS_STRING, 0, "\" \\f\\n\\r\\t\\v\\x00\"") ZEND_END_ARG_INFO() #define arginfo_rtrim arginfo_trim diff --git a/ext/standard/basic_functions_decl.h b/ext/standard/basic_functions_decl.h index 9e6fb0def4472..b926f3a272fa2 100644 --- a/ext/standard/basic_functions_decl.h +++ b/ext/standard/basic_functions_decl.h @@ -1,8 +1,8 @@ /* This is a generated file, edit basic_functions.stub.php instead. - * Stub hash: 8d1c2a735f412f8571675c6b025c3a418b68fb65 */ + * Stub hash: f5583557f058e4862750d1262296d7f59cb0eed0 */ -#ifndef ZEND_BASIC_FUNCTIONS_DECL_8d1c2a735f412f8571675c6b025c3a418b68fb65_H -#define ZEND_BASIC_FUNCTIONS_DECL_8d1c2a735f412f8571675c6b025c3a418b68fb65_H +#ifndef ZEND_BASIC_FUNCTIONS_DECL_f5583557f058e4862750d1262296d7f59cb0eed0_H +#define ZEND_BASIC_FUNCTIONS_DECL_f5583557f058e4862750d1262296d7f59cb0eed0_H typedef enum zend_enum_RoundingMode { ZEND_ENUM_RoundingMode_HalfAwayFromZero = 1, @@ -15,4 +15,4 @@ typedef enum zend_enum_RoundingMode { ZEND_ENUM_RoundingMode_PositiveInfinity = 8, } zend_enum_RoundingMode; -#endif /* ZEND_BASIC_FUNCTIONS_DECL_8d1c2a735f412f8571675c6b025c3a418b68fb65_H */ +#endif /* ZEND_BASIC_FUNCTIONS_DECL_f5583557f058e4862750d1262296d7f59cb0eed0_H */ From 8c0c892469aa61746bc8dfb53f8bc2bf9937b3a2 Mon Sep 17 00:00:00 2001 From: Weilin Du <108666168+LamentXU123@users.noreply.github.com> Date: Sun, 8 Mar 2026 15:37:05 +0800 Subject: [PATCH 10/17] Fix basic_functions_decl.h --- ext/standard/basic_functions_decl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/standard/basic_functions_decl.h b/ext/standard/basic_functions_decl.h index b926f3a272fa2..139b47f2444d4 100644 --- a/ext/standard/basic_functions_decl.h +++ b/ext/standard/basic_functions_decl.h @@ -1,5 +1,5 @@ /* This is a generated file, edit basic_functions.stub.php instead. - * Stub hash: f5583557f058e4862750d1262296d7f59cb0eed0 */ + * Stub hash: f5583557f058e4862750d1262296d7f59cb0eed0 */ #ifndef ZEND_BASIC_FUNCTIONS_DECL_f5583557f058e4862750d1262296d7f59cb0eed0_H #define ZEND_BASIC_FUNCTIONS_DECL_f5583557f058e4862750d1262296d7f59cb0eed0_H From 5ba604af43c6a2c574e0db8f064edf62c1c09c94 Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Sun, 8 Mar 2026 22:43:25 +0800 Subject: [PATCH 11/17] apply changes from code review --- NEWS | 2 +- ext/standard/tests/strings/trim.phpt | 6 ++++++ tests/classes/tostring_001.phpt | 19 ++----------------- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/NEWS b/NEWS index 2b141532d0b53..b3995df9cbb2d 100644 --- a/NEWS +++ b/NEWS @@ -121,7 +121,7 @@ PHP NEWS . Fixed bug GH-19926 (reset internal pointer earlier while splicing array while COW violation flag is still set). (alexandre-daubois) . Added form feed (\f) in the default trimmed characters of trim(), rtrim() - and ltrim(). (Weilin Du, LamentXU) + and ltrim(). (Weilin Du) . Invalid mode values now throw in array_filter() instead of being silently defaulted to 0. (Jorg Sowa) . Fixed bug GH-21058 (error_log() crashes with message_type 3 and diff --git a/ext/standard/tests/strings/trim.phpt b/ext/standard/tests/strings/trim.phpt index fd0c26d7794aa..89b7e5dabcce5 100644 --- a/ext/standard/tests/strings/trim.phpt +++ b/ext/standard/tests/strings/trim.phpt @@ -18,6 +18,9 @@ var_dump("ABC" === trim("ABC\x50\xC1\x60\x90","\x50..\xC1")); var_dump("ABC\x50\xC1" === trim("ABC\x50\xC1\x60\x90","\x51..\xC0")); var_dump("ABC\x50" === trim("ABC\x50\xC1\x60\x90","\x51..\xC1")); var_dump("ABC" === trim("ABC\x50\xC1\x60\x90","\x50..\xC1")); +var_dump('ABC' === trim('\fABC')); +var_dump('ABC' === ltrim('\fABC')); +var_dump('ABC' === rtrim('\fABC')); ?> --EXPECT-- @@ -36,3 +39,6 @@ bool(true) bool(true) bool(true) bool(true) +bool(true) +bool(true) +bool(true) diff --git a/tests/classes/tostring_001.phpt b/tests/classes/tostring_001.phpt index 00e0ede381b25..eb4e12d65ef26 100644 --- a/tests/classes/tostring_001.phpt +++ b/tests/classes/tostring_001.phpt @@ -24,16 +24,6 @@ class test3 return []; } } - -class test4 -{ - function __toString() - { - echo __METHOD__ . "()\n"; - return "Converted\f"; - } -} - echo "====test1====\n"; $o = new test1; print_r($o); @@ -87,9 +77,7 @@ try { } catch (Error $e) { echo $e->getMessage(), "\n"; } -echo "====test11====\n"; -$o = new test4(); -var_dump(trim($o)); + ?> ====DONE==== --EXPECT-- @@ -144,7 +132,4 @@ object(test3)#2 (0) { } test3::__toString() test3::__toString(): Return value must be of type string, array returned -====test11==== -test4::__toString() -string(9) "Converted" -====DONE==== +====DONE==== \ No newline at end of file From b70df6b030b88e7639b289436ef61b3c392ee4d0 Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Sun, 8 Mar 2026 22:43:25 +0800 Subject: [PATCH 12/17] apply changes from code review --- NEWS | 2 +- ext/standard/tests/strings/trim.phpt | 6 ++++++ tests/classes/tostring_001.phpt | 19 ++----------------- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/NEWS b/NEWS index 2b141532d0b53..b3995df9cbb2d 100644 --- a/NEWS +++ b/NEWS @@ -121,7 +121,7 @@ PHP NEWS . Fixed bug GH-19926 (reset internal pointer earlier while splicing array while COW violation flag is still set). (alexandre-daubois) . Added form feed (\f) in the default trimmed characters of trim(), rtrim() - and ltrim(). (Weilin Du, LamentXU) + and ltrim(). (Weilin Du) . Invalid mode values now throw in array_filter() instead of being silently defaulted to 0. (Jorg Sowa) . Fixed bug GH-21058 (error_log() crashes with message_type 3 and diff --git a/ext/standard/tests/strings/trim.phpt b/ext/standard/tests/strings/trim.phpt index fd0c26d7794aa..58495eaa9f164 100644 --- a/ext/standard/tests/strings/trim.phpt +++ b/ext/standard/tests/strings/trim.phpt @@ -18,6 +18,9 @@ var_dump("ABC" === trim("ABC\x50\xC1\x60\x90","\x50..\xC1")); var_dump("ABC\x50\xC1" === trim("ABC\x50\xC1\x60\x90","\x51..\xC0")); var_dump("ABC\x50" === trim("ABC\x50\xC1\x60\x90","\x51..\xC1")); var_dump("ABC" === trim("ABC\x50\xC1\x60\x90","\x50..\xC1")); +var_dump('ABC' === trim('\fABC\f')); +var_dump('ABC' === ltrim('\fABC')); +var_dump('ABC' === rtrim('ABC\f')); ?> --EXPECT-- @@ -36,3 +39,6 @@ bool(true) bool(true) bool(true) bool(true) +bool(true) +bool(true) +bool(true) diff --git a/tests/classes/tostring_001.phpt b/tests/classes/tostring_001.phpt index 00e0ede381b25..eb4e12d65ef26 100644 --- a/tests/classes/tostring_001.phpt +++ b/tests/classes/tostring_001.phpt @@ -24,16 +24,6 @@ class test3 return []; } } - -class test4 -{ - function __toString() - { - echo __METHOD__ . "()\n"; - return "Converted\f"; - } -} - echo "====test1====\n"; $o = new test1; print_r($o); @@ -87,9 +77,7 @@ try { } catch (Error $e) { echo $e->getMessage(), "\n"; } -echo "====test11====\n"; -$o = new test4(); -var_dump(trim($o)); + ?> ====DONE==== --EXPECT-- @@ -144,7 +132,4 @@ object(test3)#2 (0) { } test3::__toString() test3::__toString(): Return value must be of type string, array returned -====test11==== -test4::__toString() -string(9) "Converted" -====DONE==== +====DONE==== \ No newline at end of file From 965ef23192db6f316aefea5328d185437d2de745 Mon Sep 17 00:00:00 2001 From: Weilin Du <108666168+LamentXU123@users.noreply.github.com> Date: Sun, 8 Mar 2026 23:09:01 +0800 Subject: [PATCH 13/17] Update UPGRADING --- UPGRADING | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UPGRADING b/UPGRADING index 454a7b900f352..70db24d76e392 100644 --- a/UPGRADING +++ b/UPGRADING @@ -47,6 +47,8 @@ PHP 8.6 UPGRADE NOTES - Standard: . Invalid mode values now throw in array_filter() instead of being silently defaulted to 0. + . Added form feed (\f) in the default trimmed characters of trim(), rtrim() + and ltrim(). ======================================== 2. New Features From 0f70f8613a68bfdb555267d6cad1497ce4678cf0 Mon Sep 17 00:00:00 2001 From: Weilin Du <108666168+LamentXU123@users.noreply.github.com> Date: Sun, 8 Mar 2026 23:15:05 +0800 Subject: [PATCH 14/17] Update UPGRADING --- UPGRADING | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UPGRADING b/UPGRADING index 70db24d76e392..858355b11b060 100644 --- a/UPGRADING +++ b/UPGRADING @@ -47,8 +47,8 @@ PHP 8.6 UPGRADE NOTES - Standard: . Invalid mode values now throw in array_filter() instead of being silently defaulted to 0. - . Added form feed (\f) in the default trimmed characters of trim(), rtrim() - and ltrim(). + . Form feed (\f) is now added in the default trimmed characters of trim(), + rtrim() and ltrim(). ======================================== 2. New Features From f4b101f65a1424102a21e2519cc02735588123a2 Mon Sep 17 00:00:00 2001 From: Weilin Du <108666168+LamentXU123@users.noreply.github.com> Date: Mon, 9 Mar 2026 00:35:24 +0800 Subject: [PATCH 15/17] fix test --- ext/standard/tests/strings/trim.phpt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/standard/tests/strings/trim.phpt b/ext/standard/tests/strings/trim.phpt index 58495eaa9f164..9ce5e1dfff02b 100644 --- a/ext/standard/tests/strings/trim.phpt +++ b/ext/standard/tests/strings/trim.phpt @@ -18,9 +18,9 @@ var_dump("ABC" === trim("ABC\x50\xC1\x60\x90","\x50..\xC1")); var_dump("ABC\x50\xC1" === trim("ABC\x50\xC1\x60\x90","\x51..\xC0")); var_dump("ABC\x50" === trim("ABC\x50\xC1\x60\x90","\x51..\xC1")); var_dump("ABC" === trim("ABC\x50\xC1\x60\x90","\x50..\xC1")); -var_dump('ABC' === trim('\fABC\f')); -var_dump('ABC' === ltrim('\fABC')); -var_dump('ABC' === rtrim('ABC\f')); +var_dump("ABC" === trim("\fABC\f")); +var_dump("ABC" === ltrim("\fABC")); +var_dump("ABC" === rtrim("ABC\f")); ?> --EXPECT-- From 96ae846cc698150d7e6eddd767291c30579548c7 Mon Sep 17 00:00:00 2001 From: lamentxu <1372449351@qq.com> Date: Mon, 9 Mar 2026 07:48:13 +0800 Subject: [PATCH 16/17] undo changes in tostring tests --- tests/classes/tostring_001.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/classes/tostring_001.phpt b/tests/classes/tostring_001.phpt index eb4e12d65ef26..e9ef7b4175832 100644 --- a/tests/classes/tostring_001.phpt +++ b/tests/classes/tostring_001.phpt @@ -132,4 +132,4 @@ object(test3)#2 (0) { } test3::__toString() test3::__toString(): Return value must be of type string, array returned -====DONE==== \ No newline at end of file +====DONE==== From 4acddc85418bc50823a6f695d0b6de000d546519 Mon Sep 17 00:00:00 2001 From: Weilin Du <108666168+LamentXU123@users.noreply.github.com> Date: Mon, 9 Mar 2026 17:16:32 +0800 Subject: [PATCH 17/17] Add RFC link to UPGRADING note --- UPGRADING | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UPGRADING b/UPGRADING index 858355b11b060..ef6c520c80050 100644 --- a/UPGRADING +++ b/UPGRADING @@ -48,7 +48,7 @@ PHP 8.6 UPGRADE NOTES . Invalid mode values now throw in array_filter() instead of being silently defaulted to 0. . Form feed (\f) is now added in the default trimmed characters of trim(), - rtrim() and ltrim(). + rtrim() and ltrim(). RFC: https://wiki.php.net/rfc/trim_form_feed ======================================== 2. New Features