diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 740d3014f26a7..b7be370bb4777 100644 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -2555,8 +2555,8 @@ function nl2br(string $string, bool $use_xhtml = true): string {} function strip_tags(string $string, array|string|null $allowed_tags = null): string {} /** - * @param array|string $locales - * @param string $rest + * @param array|string|null $locales + * @param string|null $rest */ function setlocale(int $category, $locales, ...$rest): string|false {} diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 8655941fe4ce7..c49e229cd6c0b 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 the .stub.php file instead. - * Stub hash: f8c3745d39ed21f29f46b47f15b6fd1178e55dbb */ + * Stub hash: b9958c8f2f643e072ba7c6ee33ad238ea8dd702e */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0) diff --git a/ext/standard/string.c b/ext/standard/string.c index 75be1f1dcab1c..4bc56f550fe1b 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -4937,17 +4937,18 @@ PHP_FUNCTION(setlocale) zend_string **strings = do_alloca(sizeof(zend_string *) * num_args, use_heap); for (uint32_t i = 0; i < num_args; i++) { - if (UNEXPECTED(Z_TYPE(args[i]) != IS_ARRAY && !zend_parse_arg_str(&args[i], &strings[i], false, i + 2))) { + if (UNEXPECTED(Z_TYPE(args[i]) != IS_ARRAY && !zend_parse_arg_str(&args[i], &strings[i], true, i + 2))) { zend_wrong_parameter_type_error(i + 2, Z_EXPECTED_ARRAY_OR_STRING, &args[i]); goto out; } } for (uint32_t i = 0; i < num_args; i++) { + zend_string *result; if (Z_TYPE(args[i]) == IS_ARRAY) { zval *elem; ZEND_HASH_FOREACH_VAL(Z_ARRVAL(args[i]), elem) { - zend_string *result = try_setlocale_zval(cat, elem); + result = try_setlocale_zval(cat, elem); if (EG(exception)) { goto out; } @@ -4956,15 +4957,18 @@ PHP_FUNCTION(setlocale) goto out; } } ZEND_HASH_FOREACH_END(); + continue; + } else if (Z_ISNULL(args[i])) { + result = try_setlocale_str(cat, ZSTR_EMPTY_ALLOC()); } else { - zend_string *result = try_setlocale_str(cat, strings[i]); - if (EG(exception)) { - goto out; - } - if (result) { - RETVAL_STR(result); - goto out; - } + result = try_setlocale_str(cat, strings[i]); + } + if (EG(exception)) { + goto out; + } + if (result) { + RETVAL_STR(result); + goto out; } } diff --git a/ext/standard/tests/strings/gh18823_weak.phpt b/ext/standard/tests/strings/gh18823_weak.phpt index bc9611098a8db..2a2b82d9aaa32 100644 --- a/ext/standard/tests/strings/gh18823_weak.phpt +++ b/ext/standard/tests/strings/gh18823_weak.phpt @@ -27,6 +27,5 @@ try { echo $e->getMessage(), "\n"; } ?> ---EXPECTF-- -Deprecated: setlocale(): Passing null to parameter #2 ($locales) of type string is deprecated in %s on line %d +--EXPECT-- no diff --git a/ext/standard/tests/strings/gh19070.phpt b/ext/standard/tests/strings/gh19070.phpt new file mode 100644 index 0000000000000..e44696443cc97 --- /dev/null +++ b/ext/standard/tests/strings/gh19070.phpt @@ -0,0 +1,8 @@ +--TEST-- +GH-19070 (setlocale($type, NULL) should not be deprecated) +--FILE-- + +--EXPECTF-- +string(%d) "%s"