From e2792518600d142a3e2087a2147ecaeb40f4359b Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Wed, 5 Aug 2026 14:56:06 +0100 Subject: [PATCH 1/9] Zend: deprecate naming a function readonly RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_the_possibility_to_name_a_function_readonly --- .../readonly_as_fn_name_is_deprecated.phpt | 12 ++++++++++++ ...nly_as_fn_name_is_deprecated_namespaced.phpt | 14 ++++++++++++++ ..._as_fn_name_is_deprecated_throw_handler.phpt | 17 +++++++++++++++++ .../readonly_as_method_name_is_ok.phpt | 13 +++++++++++++ Zend/tests/grammar/readonly_function.phpt | 3 ++- Zend/zend_compile.c | 4 ++++ 6 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/functions/readonly_as_fn_name_is_deprecated.phpt create mode 100644 Zend/tests/functions/readonly_as_fn_name_is_deprecated_namespaced.phpt create mode 100644 Zend/tests/functions/readonly_as_fn_name_is_deprecated_throw_handler.phpt create mode 100644 Zend/tests/functions/readonly_as_method_name_is_ok.phpt diff --git a/Zend/tests/functions/readonly_as_fn_name_is_deprecated.phpt b/Zend/tests/functions/readonly_as_fn_name_is_deprecated.phpt new file mode 100644 index 000000000000..2ac975dcf654 --- /dev/null +++ b/Zend/tests/functions/readonly_as_fn_name_is_deprecated.phpt @@ -0,0 +1,12 @@ +--TEST-- +Naming a function readonly is deprecated +--FILE-- + +DONE +--EXPECTF-- +Deprecated: Calling a function “readonly” is deprecated in %s on line %d +DONE diff --git a/Zend/tests/functions/readonly_as_fn_name_is_deprecated_namespaced.phpt b/Zend/tests/functions/readonly_as_fn_name_is_deprecated_namespaced.phpt new file mode 100644 index 000000000000..f4b39d6c3e5a --- /dev/null +++ b/Zend/tests/functions/readonly_as_fn_name_is_deprecated_namespaced.phpt @@ -0,0 +1,14 @@ +--TEST-- +Naming a function readonly is deprecated +--FILE-- + +DONE +--EXPECTF-- +Deprecated: Calling a function “readonly” is deprecated in %s on line %d +DONE diff --git a/Zend/tests/functions/readonly_as_fn_name_is_deprecated_throw_handler.phpt b/Zend/tests/functions/readonly_as_fn_name_is_deprecated_throw_handler.phpt new file mode 100644 index 000000000000..428bd339d111 --- /dev/null +++ b/Zend/tests/functions/readonly_as_fn_name_is_deprecated_throw_handler.phpt @@ -0,0 +1,17 @@ +--TEST-- +Naming a function readonly is deprecated with an error handler elevating it to an exception +--FILE-- + +DONE +--EXPECTF-- +Deprecated: Calling a function “readonly” is deprecated in %s on line %d +DONE diff --git a/Zend/tests/functions/readonly_as_method_name_is_ok.phpt b/Zend/tests/functions/readonly_as_method_name_is_ok.phpt new file mode 100644 index 000000000000..373fa735365b --- /dev/null +++ b/Zend/tests/functions/readonly_as_method_name_is_ok.phpt @@ -0,0 +1,13 @@ +--TEST-- +Naming a function readonly is deprecated +--FILE-- + +DONE +--EXPECT-- +DONE diff --git a/Zend/tests/grammar/readonly_function.phpt b/Zend/tests/grammar/readonly_function.phpt index 35102d36b9dc..c1592aa1fe8c 100644 --- a/Zend/tests/grammar/readonly_function.phpt +++ b/Zend/tests/grammar/readonly_function.phpt @@ -32,7 +32,8 @@ $b->readonly(); echo $b->readonly, "\n"; ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Calling a function “readonly” is deprecated in %s on line %d Hi! Const hi! Static hi! diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index a2f126fb101d..e27203d2984f 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -8929,6 +8929,10 @@ static zend_string *zend_begin_func_decl(znode *result, zend_op_array *op_array, "__autoload() is no longer supported, use spl_autoload_register() instead"); } + if (zend_string_equals_literal_ci(unqualified_name, "readonly")) { + zend_error(E_DEPRECATED, "Calling a function “readonly” is deprecated"); + } + if (zend_string_equals_literal_ci(unqualified_name, "assert")) { zend_error(E_COMPILE_ERROR, "Defining a custom assert() function is not allowed, " From d59475b865140548cddf30e8c8ce41988e28529f Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Wed, 5 Aug 2026 15:05:55 +0100 Subject: [PATCH 2/9] standard: deprecate passing an object to array_walk{_recursive}() RFC: https://wiki.php.net/rfc/deprecations_php_8_6#passing_objects_for_array_parameter_of_array_walk_and_array_walk_recursive --- Zend/tests/exceptions/gh16188.phpt | 1 + Zend/tests/lazy_objects/array_walk.phpt | 1 + Zend/tests/property_hooks/gh18268.phpt | 3 ++- ext/ffi/tests/gh9697.phpt | 3 ++- ext/standard/array.c | 17 +++++++++++++++++ .../array/array_walk/array_walk_object1.phpt | 2 ++ .../array/array_walk/array_walk_objects.phpt | 3 +++ .../array_walk/array_walk_rec_objects.phpt | 3 +++ .../array_walk_recursive_object1.phpt | 2 ++ .../tests/array/array_walk/bug79839.phpt | 3 ++- 10 files changed, 35 insertions(+), 3 deletions(-) diff --git a/Zend/tests/exceptions/gh16188.phpt b/Zend/tests/exceptions/gh16188.phpt index 4516f7cade90..2be2f991c8f3 100644 --- a/Zend/tests/exceptions/gh16188.phpt +++ b/Zend/tests/exceptions/gh16188.phpt @@ -16,6 +16,7 @@ printf("__toString:\n%s\n\n", $re); ?> ==DONE== --EXPECTF-- +Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d getTraceAsString: #0 {main} diff --git a/Zend/tests/lazy_objects/array_walk.phpt b/Zend/tests/lazy_objects/array_walk.phpt index afee146025c9..3de8d6331a3c 100644 --- a/Zend/tests/lazy_objects/array_walk.phpt +++ b/Zend/tests/lazy_objects/array_walk.phpt @@ -26,6 +26,7 @@ var_dump($obj); ?> --EXPECTF-- +Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d TypeError: Cannot assign string to reference held by property C::$a of type int lazy proxy object(C)#%d (1) { ["instance"]=> diff --git a/Zend/tests/property_hooks/gh18268.phpt b/Zend/tests/property_hooks/gh18268.phpt index 9836bb6d9627..78099923999d 100644 --- a/Zend/tests/property_hooks/gh18268.phpt +++ b/Zend/tests/property_hooks/gh18268.phpt @@ -19,5 +19,6 @@ array_walk($b, function (&$item) { }); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d int(42) diff --git a/ext/ffi/tests/gh9697.phpt b/ext/ffi/tests/gh9697.phpt index 7d19480e6944..0f82c8b43a26 100644 --- a/ext/ffi/tests/gh9697.phpt +++ b/ext/ffi/tests/gh9697.phpt @@ -10,5 +10,6 @@ $x = FFI::cdef()->new('int'); array_walk($x, function($x) { echo "test\n"; }); ?> DONE ---EXPECT-- +--EXPECTF-- +Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d DONE diff --git a/ext/standard/array.c b/ext/standard/array.c index 584afada2089..c929a57a4303 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1511,6 +1511,14 @@ PHP_FUNCTION(array_walk) Z_PARAM_ZVAL(userdata) ZEND_PARSE_PARAMETERS_END(); + if (Z_TYPE_P(array) == IS_OBJECT) { + php_error_docref(NULL, E_DEPRECATED, + "Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead"); + if (UNEXPECTED(EG(exception))) { + RETURN_THROWS(); + } + } + php_array_walk(&context, array, userdata, /* recursive */ false); RETURN_TRUE; } @@ -1530,6 +1538,15 @@ PHP_FUNCTION(array_walk_recursive) Z_PARAM_ZVAL(userdata) ZEND_PARSE_PARAMETERS_END(); + + if (Z_TYPE_P(array) == IS_OBJECT) { + php_error_docref(NULL, E_DEPRECATED, + "Passing an object for argument #1 $array to array_walk_recursive() is deprecated, call get_object_vars() first instead"); + if (UNEXPECTED(EG(exception))) { + RETURN_THROWS(); + } + } + php_array_walk(&context, array, userdata, /* recursive */ true); RETURN_TRUE; } diff --git a/ext/standard/tests/array/array_walk/array_walk_object1.phpt b/ext/standard/tests/array/array_walk/array_walk_object1.phpt index 7c700be11846..cd722f04abc1 100644 --- a/ext/standard/tests/array/array_walk/array_walk_object1.phpt +++ b/ext/standard/tests/array/array_walk/array_walk_object1.phpt @@ -38,6 +38,8 @@ echo "Done" ?> --EXPECTF-- *** Testing array_walk() : object functionality *** + +Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d string(18) "%r\0%rMyClass%r\0%rpri_value" int(10) int(1) diff --git a/ext/standard/tests/array/array_walk/array_walk_objects.phpt b/ext/standard/tests/array/array_walk/array_walk_objects.phpt index 44b5b27e51e8..cc50ad38b9c2 100644 --- a/ext/standard/tests/array/array_walk/array_walk_objects.phpt +++ b/ext/standard/tests/array/array_walk/array_walk_objects.phpt @@ -33,10 +33,13 @@ try { echo "Done\n"; ?> --EXPECTF-- +Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d string(3) "foo" string(3) "foo" string(3) "bar" string(3) "bar" + +Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d string(13) "%r\0%rtest%r\0%rvar_pri" string(12) "test_private" string(10) "%r\0%r*%r\0%rvar_pro" diff --git a/ext/standard/tests/array/array_walk/array_walk_rec_objects.phpt b/ext/standard/tests/array/array_walk/array_walk_rec_objects.phpt index 91a97437d217..26082134f632 100644 --- a/ext/standard/tests/array/array_walk/array_walk_rec_objects.phpt +++ b/ext/standard/tests/array/array_walk/array_walk_rec_objects.phpt @@ -33,10 +33,13 @@ try { echo "Done\n"; ?> --EXPECTF-- +Deprecated: array_walk_recursive(): Passing an object for argument #1 $array to array_walk_recursive() is deprecated, call get_object_vars() first instead in %s on line %d string(3) "foo" string(3) "foo" string(3) "bar" string(3) "bar" + +Deprecated: array_walk_recursive(): Passing an object for argument #1 $array to array_walk_recursive() is deprecated, call get_object_vars() first instead in %s on line %d string(13) "%0test%0var_pri" string(12) "test_private" string(10) "%0*%0var_pro" diff --git a/ext/standard/tests/array/array_walk/array_walk_recursive_object1.phpt b/ext/standard/tests/array/array_walk/array_walk_recursive_object1.phpt index 9570bf8a02e2..023117b09edf 100644 --- a/ext/standard/tests/array/array_walk/array_walk_recursive_object1.phpt +++ b/ext/standard/tests/array/array_walk/array_walk_recursive_object1.phpt @@ -36,6 +36,8 @@ echo "Done" ?> --EXPECTF-- *** Testing array_walk_recursive() : object functionality *** + +Deprecated: array_walk_recursive(): Passing an object for argument #1 $array to array_walk_recursive() is deprecated, call get_object_vars() first instead in %s on line %d string(18) "%r\0%rMyClass%r\0%rpri_value" int(10) int(1) diff --git a/ext/standard/tests/array/array_walk/bug79839.phpt b/ext/standard/tests/array/array_walk/bug79839.phpt index 643604cb9b20..fe7db73c4683 100644 --- a/ext/standard/tests/array/array_walk/bug79839.phpt +++ b/ext/standard/tests/array/array_walk/bug79839.phpt @@ -18,7 +18,8 @@ try { var_dump($test); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: array_walk(): Passing an object for argument #1 $array to array_walk() is deprecated, call get_object_vars() first instead in %s on line %d Cannot assign array to reference held by property Test::$prop of type int object(Test)#1 (1) { ["prop"]=> From d9df23352ed9a67fbaf4a6769cd423d0f0b4bef5 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Wed, 5 Aug 2026 15:48:24 +0100 Subject: [PATCH 3/9] zlib: deprecate passing objects as array Implements RFCs: - https://wiki.php.net/rfc/deprecations_php_8_6#passing_objects_for_options_parameter_of_deflate_init_and_inflate_init - https://wiki.php.net/rfc/deprecations_php_8_6#passing_objects_as_parameters_to_the_zlibinflate_and_zlibdeflate_stream_filters --- .../tests/filter_broken_object_options.phpt | 5 +++- ext/zlib/tests/gh17745.phpt | 5 +++- ext/zlib/tests/gh17745_inflate.phpt | 23 +++++++++++++++ ext/zlib/tests/gh22142.phpt | 3 +- ext/zlib/tests/gh22142_inflate.phpt | 21 ++++++++++++++ ext/zlib/zlib.c | 28 +++++++++++++++++-- ext/zlib/zlib_filter.c | 24 ++++++++++------ 7 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 ext/zlib/tests/gh17745_inflate.phpt create mode 100644 ext/zlib/tests/gh22142_inflate.phpt diff --git a/ext/zlib/tests/filter_broken_object_options.phpt b/ext/zlib/tests/filter_broken_object_options.phpt index beb0fef9fb13..a43c85f36718 100644 --- a/ext/zlib/tests/filter_broken_object_options.phpt +++ b/ext/zlib/tests/filter_broken_object_options.phpt @@ -17,5 +17,8 @@ stream_filter_append($fp, 'zlib.inflate', STREAM_FILTER_WRITE, new Params); fwrite($fp, "Hello world, hopefully not broken\n"); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: stream_filter_append(): Passing an object for filter parameters for zlib.deflate is deprecated, call get_object_vars() first instead in %s on line %d + +Deprecated: stream_filter_append(): Passing an object for filter parameters for zlib.inflate is deprecated, call get_object_vars() first instead in %s on line %d Hello world, hopefully not broken diff --git a/ext/zlib/tests/gh17745.phpt b/ext/zlib/tests/gh17745.phpt index 64331269dcda..5e522ee96145 100644 --- a/ext/zlib/tests/gh17745.phpt +++ b/ext/zlib/tests/gh17745.phpt @@ -13,8 +13,11 @@ class Options { } var_dump(deflate_init(ZLIB_ENCODING_RAW, new Options)); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: deflate_init(): Passing an object for argument #2 $option to deflate_init() is deprecated, call get_object_vars() first instead in %s on line %d object(DeflateContext)#2 (0) { } + +Deprecated: deflate_init(): Passing an object for argument #2 $option to deflate_init() is deprecated, call get_object_vars() first instead in %s on line %d object(DeflateContext)#3 (0) { } diff --git a/ext/zlib/tests/gh17745_inflate.phpt b/ext/zlib/tests/gh17745_inflate.phpt new file mode 100644 index 000000000000..c87f0fbea9dd --- /dev/null +++ b/ext/zlib/tests/gh17745_inflate.phpt @@ -0,0 +1,23 @@ +--TEST-- +GH-17745 (zlib extension incorrectly handles object arguments) +--EXTENSIONS-- +zlib +--FILE-- +level = 3; +var_dump(inflate_init(ZLIB_ENCODING_RAW, $obj)); + +class Options { + public int $level = 3; +} +var_dump(inflate_init(ZLIB_ENCODING_RAW, new Options)); +?> +--EXPECTF-- +Deprecated: inflate_init(): Passing an object for argument #2 $option to inflate_init() is deprecated, call get_object_vars() first instead in %s on line %d +object(InflateContext)#2 (0) { +} + +Deprecated: inflate_init(): Passing an object for argument #2 $option to inflate_init() is deprecated, call get_object_vars() first instead in %s on line %d +object(InflateContext)#3 (0) { +} diff --git a/ext/zlib/tests/gh22142.phpt b/ext/zlib/tests/gh22142.phpt index 9bbb9332df30..481ffef342aa 100644 --- a/ext/zlib/tests/gh22142.phpt +++ b/ext/zlib/tests/gh22142.phpt @@ -16,5 +16,6 @@ try { } ?> ---EXPECT-- +--EXPECTF-- +Deprecated: deflate_init(): Passing an object for argument #2 $option to deflate_init() is deprecated, call get_object_vars() first instead in %s on line %d TypeError: deflate_init(): Argument #2 ($options) the value for option "level" must be of type int, null given diff --git a/ext/zlib/tests/gh22142_inflate.phpt b/ext/zlib/tests/gh22142_inflate.phpt new file mode 100644 index 000000000000..853099e4911d --- /dev/null +++ b/ext/zlib/tests/gh22142_inflate.phpt @@ -0,0 +1,21 @@ +--TEST-- +GH-22142 (Assertion failure in zendi_try_get_long() on IS_UNDEF) +--EXTENSIONS-- +zlib +--FILE-- +getMessage(), PHP_EOL; +} + +?> +--EXPECTF-- +Deprecated: inflate_init(): Passing an object for argument #2 $option to inflate_init() is deprecated, call get_object_vars() first instead in %s on line %d +TypeError: inflate_init(): Argument #2 ($options) the value for option "window" must be of type int, null given diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index 5b630d74c889..44ab23233ac8 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -881,12 +881,24 @@ PHP_FUNCTION(inflate_init) zend_long encoding, window = 15; char *dict = NULL; size_t dictlen = 0; + zval *options_zv = NULL; HashTable *options = (HashTable *) &zend_empty_array; - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "l|H", &encoding, &options)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "l|A", &encoding, &options_zv)) { RETURN_THROWS(); } + if (options_zv) { + if (Z_TYPE_P(options_zv) == IS_OBJECT) { + php_error_docref(NULL, E_DEPRECATED, + "Passing an object for argument #2 $option to inflate_init() is deprecated, call get_object_vars() first instead"); + if (UNEXPECTED(EG(exception))) { + RETURN_THROWS(); + } + } + options = HASH_OF(options_zv); + } + if (!zlib_get_long_option(options, ZEND_STRL("window"), &window)) { RETURN_THROWS(); } @@ -1100,12 +1112,24 @@ PHP_FUNCTION(deflate_init) zend_long encoding, level = -1, memory = 8, window = 15, strategy = Z_DEFAULT_STRATEGY; char *dict = NULL; size_t dictlen = 0; + zval *options_zv = NULL; HashTable *options = (HashTable*)&zend_empty_array; - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "l|H", &encoding, &options)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "l|A", &encoding, &options_zv)) { RETURN_THROWS(); } + if (options_zv) { + if (Z_TYPE_P(options_zv) == IS_OBJECT) { + php_error_docref(NULL, E_DEPRECATED, + "Passing an object for argument #2 $option to deflate_init() is deprecated, call get_object_vars() first instead"); + if (UNEXPECTED(EG(exception))) { + RETURN_THROWS(); + } + } + options = HASH_OF(options_zv); + } + if (!zlib_get_long_option(options, ZEND_STRL("level"), &level)) { RETURN_THROWS(); } diff --git a/ext/zlib/zlib_filter.c b/ext/zlib/zlib_filter.c index 2d0e4fbb7fa4..4e6c1a54c0f9 100644 --- a/ext/zlib/zlib_filter.c +++ b/ext/zlib/zlib_filter.c @@ -361,6 +361,14 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f php_zlib_filter_data *data; int status; + if (filterparams && Z_TYPE_P(filterparams) == IS_OBJECT) { + php_error_docref("filters.compression", E_DEPRECATED, + "Passing an object for filter parameters for %s is deprecated, call get_object_vars() first instead", filtername); + if (UNEXPECTED(EG(exception))) { + return NULL; + } + } + if (php_stream_filter_parse_write_seek_mode(filterparams, &write_seekable) == FAILURE) { return NULL; } @@ -368,7 +376,7 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f /* Create this filter */ data = pecalloc(1, sizeof(php_zlib_filter_data), persistent); if (!data) { - php_error_docref(NULL, E_WARNING, "Failed allocating %zd bytes", sizeof(php_zlib_filter_data)); + php_error_docref("filters.compression", E_WARNING, "Failed allocating %zd bytes", sizeof(php_zlib_filter_data)); return NULL; } @@ -380,14 +388,14 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f data->strm.avail_out = data->outbuf_len = data->inbuf_len = 0x8000; data->strm.next_in = data->inbuf = (Bytef *) pemalloc(data->inbuf_len, persistent); if (!data->inbuf) { - php_error_docref(NULL, E_WARNING, "Failed allocating %zd bytes", data->inbuf_len); + php_error_docref("filters.compression", E_WARNING, "Failed allocating %zd bytes", data->inbuf_len); pefree(data, persistent); return NULL; } data->strm.avail_in = 0; data->strm.next_out = data->outbuf = (Bytef *) pemalloc(data->outbuf_len, persistent); if (!data->outbuf) { - php_error_docref(NULL, E_WARNING, "Failed allocating %zd bytes", data->outbuf_len); + php_error_docref("filters.compression", E_WARNING, "Failed allocating %zd bytes", data->outbuf_len); pefree(data->inbuf, persistent); pefree(data, persistent); return NULL; @@ -407,7 +415,7 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f /* log-2 base of history window (9 - 15) */ zend_long tmp = zval_get_long(tmpzval); if (tmp < -MAX_WBITS || tmp > MAX_WBITS + 32) { - php_error_docref(NULL, E_WARNING, "Invalid parameter given for window size (" ZEND_LONG_FMT ")", tmp); + php_error_docref("filters.compression", E_WARNING, "Invalid parameter given for window size (" ZEND_LONG_FMT ")", tmp); } else { windowBits = tmp; } @@ -444,7 +452,7 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f /* Memory Level (1 - 9) */ tmp = zval_get_long(tmpzval); if (tmp < 1 || tmp > MAX_MEM_LEVEL) { - php_error_docref(NULL, E_WARNING, "Invalid parameter given for memory level (" ZEND_LONG_FMT ")", tmp); + php_error_docref("filters.compression", E_WARNING, "Invalid parameter given for memory level (" ZEND_LONG_FMT ")", tmp); } else { memLevel = tmp; } @@ -454,7 +462,7 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f /* log-2 base of history window (9 - 15) */ tmp = zval_get_long(tmpzval); if (tmp < -MAX_WBITS || tmp > MAX_WBITS + 16) { - php_error_docref(NULL, E_WARNING, "Invalid parameter given for window size (" ZEND_LONG_FMT ")", tmp); + php_error_docref("filters.compression", E_WARNING, "Invalid parameter given for window size (" ZEND_LONG_FMT ")", tmp); } else { windowBits = tmp; } @@ -475,13 +483,13 @@ static php_stream_filter *php_zlib_filter_create(const char *filtername, zval *f factory_setlevel: /* Set compression level within reason (-1 == default, 0 == none, 1-9 == least to most compression */ if (tmp < -1 || tmp > 9) { - php_error_docref(NULL, E_WARNING, "Invalid compression level specified. (" ZEND_LONG_FMT ")", tmp); + php_error_docref("filters.compression", E_WARNING, "Invalid compression level specified. (" ZEND_LONG_FMT ")", tmp); } else { level = tmp; } break; default: - php_error_docref(NULL, E_WARNING, "Invalid filter parameter, ignored"); + php_error_docref("filters.compression", E_WARNING, "Invalid filter parameter, ignored"); } } From 0571897f341efaea94eb58d4038c80101f896f09 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Wed, 5 Aug 2026 15:54:12 +0100 Subject: [PATCH 4/9] bz2: deprecate passing objects as array RFC: https://wiki.php.net/rfc/deprecations_php_8_6#passing_objects_as_parameters_to_the_bzip2decompress_and_bzip2compress_stream_filters --- ext/bz2/bz2_filter.c | 26 ++++++++++++++----- .../tests/filter_broken_object_options.phpt | 5 +++- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/ext/bz2/bz2_filter.c b/ext/bz2/bz2_filter.c index 845c11865f15..47fc9fc6e62f 100644 --- a/ext/bz2/bz2_filter.c +++ b/ext/bz2/bz2_filter.c @@ -402,12 +402,19 @@ static php_stream_filter *php_bz2_decompress_filter_create(zval *filter_params, && Z_TYPE_P(filter_params) != IS_ARRAY && Z_TYPE_P(filter_params) != IS_OBJECT )) { - php_error_docref(NULL, E_WARNING, + php_error_docref("filters.compression", E_WARNING, "Filter parameters for bzip2.decompress filter must be of type array|object|bool, %s given", zend_zval_type_name(filter_params) ); return NULL; } + if (Z_TYPE_P(filter_params) == IS_OBJECT) { + php_error_docref("filters.compression", E_DEPRECATED, + "Passing an object for filter parameters for bzip2.decompress is deprecated, call get_object_vars() first instead"); + if (UNEXPECTED(EG(exception))) { + return NULL; + } + } if (Z_TYPE_P(filter_params) == IS_TRUE || Z_TYPE_P(filter_params) == IS_FALSE) { small_footprint = Z_TYPE_P(filter_params) == IS_TRUE; @@ -448,12 +455,19 @@ static php_stream_filter *php_bz2_compress_filter_create(zval *filter_params, bo if (filter_params) { if (UNEXPECTED(Z_TYPE_P(filter_params) != IS_ARRAY && Z_TYPE_P(filter_params) != IS_OBJECT)) { - php_error_docref(NULL, E_WARNING, + php_error_docref("filters.compression", E_WARNING, "Filter parameters for bzip2.compress filter must be of type array|object, %s given", zend_zval_type_name(filter_params) ); return NULL; } + if (Z_TYPE_P(filter_params) == IS_OBJECT) { + php_error_docref("filters.compression", E_DEPRECATED, + "Passing an object for filter parameters for bzip2.compress is deprecated, call get_object_vars() first instead"); + if (UNEXPECTED(EG(exception))) { + return NULL; + } + } const HashTable *filter_params_ht = HASH_OF(filter_params); /* TODO: convert php_stream_filter_parse_write_seek_mode() to take HashTable */ @@ -468,10 +482,10 @@ static php_stream_filter *php_bz2_compress_filter_create(zval *filter_params, bo /* How much memory to allocate (1 - 9) x 100kb */ zend_long blocks = zval_try_get_long(blocks_zv, &failed); if (UNEXPECTED(failed)) { - php_error_docref(NULL, E_WARNING, "Number of blocks parameter must be of type int, %s given", zend_zval_type_name(blocks_zv)); + php_error_docref("filters.compression", E_WARNING, "Number of blocks parameter must be of type int, %s given", zend_zval_type_name(blocks_zv)); return NULL; } else if (blocks < 1 || blocks > 9) { - php_error_docref(NULL, E_WARNING, "Number of blocks to allocate must be between 1 and 9, " ZEND_LONG_FMT " given", blocks); + php_error_docref("filters.compression", E_WARNING, "Number of blocks to allocate must be between 1 and 9, " ZEND_LONG_FMT " given", blocks); return NULL; } else { blockSize100k = (int) blocks; @@ -485,10 +499,10 @@ static php_stream_filter *php_bz2_compress_filter_create(zval *filter_params, bo /* Work Factor (0 - 250) */ zend_long work = zval_try_get_long(work_zv, &failed); if (UNEXPECTED(failed)) { - php_error_docref(NULL, E_WARNING, "Work factor parameter must be of type int, %s given", zend_zval_type_name(work_zv)); + php_error_docref("filters.compression", E_WARNING, "Work factor parameter must be of type int, %s given", zend_zval_type_name(work_zv)); return NULL; } else if (work < 0 || work > 250) { - php_error_docref(NULL, E_WARNING, "Work factor must be between 0 and 250, " ZEND_LONG_FMT " given", work); + php_error_docref("filters.compression", E_WARNING, "Work factor must be between 0 and 250, " ZEND_LONG_FMT " given", work); return NULL; } else { workFactor = (int) work; diff --git a/ext/bz2/tests/filter_broken_object_options.phpt b/ext/bz2/tests/filter_broken_object_options.phpt index 84e49a64ccb6..c24e2893c2b9 100644 --- a/ext/bz2/tests/filter_broken_object_options.phpt +++ b/ext/bz2/tests/filter_broken_object_options.phpt @@ -21,5 +21,8 @@ stream_filter_append($fp, 'bzip2.decompress', STREAM_FILTER_WRITE, new ParamsDec fwrite($fp, "Hello world, hopefully not broken\n"); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: stream_filter_append(): Passing an object for filter parameters for bzip2.compress is deprecated, call get_object_vars() first instead in %s on line %d + +Deprecated: stream_filter_append(): Passing an object for filter parameters for bzip2.decompress is deprecated, call get_object_vars() first instead in %s on line %d Hello world, hopefully not broken From dbbf2d2c9c8bc93c2c2b27a1008da654b3887043 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Wed, 5 Aug 2026 16:23:31 +0100 Subject: [PATCH 5/9] mbstring: deprecate passing objects as vars to mb_convert_variables() RFC: https://wiki.php.net/rfc/deprecations_php_8_6#passing_objects_for_vars_parameter_of_mb_convert_variables --- ext/mbstring/mbstring.c | 23 ++++++++++++-- ext/mbstring/tests/gh16261.phpt | 3 +- ext/mbstring/tests/mb_convert_variables.phpt | 18 ++++++++++- .../mb_convert_variables_invalid_types.phpt | 30 +++++++++++++++++++ 4 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 ext/mbstring/tests/mb_convert_variables_invalid_types.phpt diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index b475b83e02f3..4059d8d35fd1 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -3820,7 +3820,7 @@ static bool mb_recursive_find_strings(zval *var, const unsigned char **val_list, return false; } -static bool mb_recursive_convert_variable(zval *var, const mbfl_encoding* from_encoding, const mbfl_encoding* to_encoding) +static bool mb_recursive_convert_variable(uint32_t arg_num, zval *var, const mbfl_encoding* from_encoding, const mbfl_encoding* to_encoding) { zval *entry, *orig_var; @@ -3836,6 +3836,15 @@ static bool mb_recursive_convert_variable(zval *var, const mbfl_encoding* from_e zval_ptr_dtor(orig_var); ZVAL_STR(orig_var, ret); } else if (Z_TYPE_P(var) == IS_ARRAY || Z_TYPE_P(var) == IS_OBJECT) { + if (Z_TYPE_P(var) == IS_OBJECT) { + php_error_docref(NULL, E_DEPRECATED, + "Passing an object for argument #%" PRIu32 " $vars to mb_convert_variables() is deprecated, call get_object_vars() first instead", + arg_num + ); + if (UNEXPECTED(EG(exception))) { + return true; + } + } HashTable *ht = HASH_OF(var); HashTable *orig_ht = ht; @@ -3872,7 +3881,7 @@ static bool mb_recursive_convert_variable(zval *var, const mbfl_encoding* from_e } } - if (mb_recursive_convert_variable(entry, from_encoding, to_encoding)) { + if (mb_recursive_convert_variable(arg_num, entry, from_encoding, to_encoding)) { if (ht && ht != orig_ht) { GC_TRY_UNPROTECT_RECURSION(ht); } @@ -3890,6 +3899,14 @@ static bool mb_recursive_convert_variable(zval *var, const mbfl_encoding* from_e if (orig_ht) { GC_TRY_UNPROTECT_RECURSION(orig_ht); } + } else if (Z_TYPE_P(var) != IS_UNDEF) { /* Ignore unset properties */ + php_error_docref(NULL, E_WARNING, + "Argument #%" PRIu32 " must be of type string|array|object or only contain entries of type string|array|object, %s given", + arg_num, zend_zval_type_name(var) + ); + if (UNEXPECTED(EG(exception))) { + return true; + } } return false; @@ -3985,7 +4002,7 @@ PHP_FUNCTION(mb_convert_variables) for (size_t n = 0; n < argc; n++) { zval *zv = &args[n]; ZVAL_DEREF(zv); - if (mb_recursive_convert_variable(zv, from_encoding, to_encoding)) { + if (mb_recursive_convert_variable(n + 3, zv, from_encoding, to_encoding)) { if (!EG(exception)) { php_error_docref(NULL, E_WARNING, "Cannot handle recursive references"); } diff --git a/ext/mbstring/tests/gh16261.phpt b/ext/mbstring/tests/gh16261.phpt index 3573bd191c63..1fbbc5c208c9 100644 --- a/ext/mbstring/tests/gh16261.phpt +++ b/ext/mbstring/tests/gh16261.phpt @@ -26,7 +26,8 @@ mb_convert_variables("EUC-JP", "Shift_JIS", $test->x); var_dump($test, $test2); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: mb_convert_variables(): Passing an object for argument #3 $vars to mb_convert_variables() is deprecated, call get_object_vars() first instead in %s on line %d object(Test)#1 (2) { ["x"]=> string(5) "hello" diff --git a/ext/mbstring/tests/mb_convert_variables.phpt b/ext/mbstring/tests/mb_convert_variables.phpt index 2eb45946b5e8..7558bded048d 100644 --- a/ext/mbstring/tests/mb_convert_variables.phpt +++ b/ext/mbstring/tests/mb_convert_variables.phpt @@ -173,7 +173,7 @@ var_dump(mb_convert_variables('UTF-8', 'UTF7-IMAP,UTF-8', $bad_utf7imap)); var_dump($bad_utf7imap); ?> ---EXPECT-- +--EXPECTF-- == SCALAR TEST == SJIS c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3 @@ -191,21 +191,37 @@ c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3c6fccb EUC-JP c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3 == OBJECT TEST == + +Deprecated: mb_convert_variables(): Passing an object for argument #3 $vars to mb_convert_variables() is deprecated, call get_object_vars() first instead in %s on line %d EUC-JP c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3 + +Deprecated: mb_convert_variables(): Passing an object for argument #3 $vars to mb_convert_variables() is deprecated, call get_object_vars() first instead in %s on line %d EUC-JP c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3 == SCALAR, ARRAY AND OBJECT TEST == + +Deprecated: mb_convert_variables(): Passing an object for argument #7 $vars to mb_convert_variables() is deprecated, call get_object_vars() first instead in %s on line %d EUC-JP c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3 c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3 c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3c6fccbdcb8eca5c6a5ada5b9a5c8a4c7a4b9a1a33031323334a3b5a3b6a3b7a3b8a3b9a1a3 == DEEPLY NESTED OBJECT/ARRAY TEST == + +Deprecated: mb_convert_variables(): Passing an object for argument #3 $vars to mb_convert_variables() is deprecated, call get_object_vars() first instead in %s on line %d + +Deprecated: mb_convert_variables(): Passing an object for argument #3 $vars to mb_convert_variables() is deprecated, call get_object_vars() first instead in %s on line %d + +Deprecated: mb_convert_variables(): Passing an object for argument #3 $vars to mb_convert_variables() is deprecated, call get_object_vars() first instead in %s on line %d UTF-8 42004c0041004800 == INVALID STRING ENCODING TEST == + +Deprecated: mb_convert_variables(): Passing an object for argument #3 $vars to mb_convert_variables() is deprecated, call get_object_vars() first instead in %s on line %d 2500 # of illegal characters detected: 1 + +Deprecated: mb_convert_variables(): Passing an object for argument #3 $vars to mb_convert_variables() is deprecated, call get_object_vars() first instead in %s on line %d 2600 # of illegal characters detected: 1 == ENCODING AUTO-DETECTION TEST == diff --git a/ext/mbstring/tests/mb_convert_variables_invalid_types.phpt b/ext/mbstring/tests/mb_convert_variables_invalid_types.phpt new file mode 100644 index 000000000000..70972f042130 --- /dev/null +++ b/ext/mbstring/tests/mb_convert_variables_invalid_types.phpt @@ -0,0 +1,30 @@ +--TEST-- +mb_convert_variables(): $vars which are not string|array|object +--EXTENSIONS-- +mbstring +--FILE-- +getMessage(), PHP_EOL; +} +try { + var_dump( mb_convert_variables('UTF-8', 'EUC-JP', $a)); +} catch (\ValueError $e) { + echo $e::class, ': ', $e->getMessage(), PHP_EOL; +} + +?> +--EXPECTF-- +Warning: mb_convert_variables(): Argument #3 must be of type string|array|object or only contain entries of type string|array|object, int given in %s on line %d + +Warning: mb_convert_variables(): Argument #4 must be of type string|array|object or only contain entries of type string|array|object, int given in %s on line %d +string(6) "EUC-JP" + +Warning: mb_convert_variables(): Argument #3 must be of type string|array|object or only contain entries of type string|array|object, int given in %s on line %d +string(6) "EUC-JP" From 57a6c6b9a55d078666a56814b730df2a98605364 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Wed, 5 Aug 2026 17:23:27 +0100 Subject: [PATCH 6/9] standard: deprecate aliases with non canonical type name Fix tests using non canonical versions and improve existing tests. RFC: - https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_is_double - https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_is_integer - https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_is_long - https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_doubleval --- .../union_types/incdec_prop.phpt | 16 +- Zend/zend_compile.c | 13 +- ext/date/tests/strtotime-mysql-64bit.phpt | 2 +- ext/date/tests/strtotime-mysql.phpt | 2 +- ext/date/tests/strtotime3-64bit.phpt | 2 +- ext/date/tests/strtotime3.phpt | 2 +- ext/filter/tests/046.phpt | 10 +- ext/filter/tests/047.phpt | 6 +- ext/filter/tests/048.phpt | 6 +- ext/pgsql/tests/20pg_get_pid.phpt | 2 +- ext/posix/tests/posix_getsid.phpt | 2 +- ext/spl/tests/regexiterator_getpregflags.phpt | 4 +- ext/standard/basic_functions.stub.php | 4 + ext/standard/basic_functions_arginfo.h | 38 +- ext/standard/basic_functions_decl.h | 8 +- .../tests/general_functions/doubleval.phpt | 50 ++ .../tests/general_functions/floatval.phpt | 171 ------- .../general_functions/floatval_basic.phpt | 117 +---- .../floatval_variation1.phpt | 88 +--- .../tests/general_functions/is_float.phpt | 299 +----------- .../general_functions/is_float_64bit.phpt | 333 -------------- .../general_functions/is_float_alias.phpt | 12 + .../tests/general_functions/is_int.phpt | 422 ++--------------- .../tests/general_functions/is_int_64bit.phpt | 427 ------------------ .../general_functions/is_int_aliases.phpt | 16 + 25 files changed, 242 insertions(+), 1810 deletions(-) create mode 100644 ext/standard/tests/general_functions/doubleval.phpt delete mode 100644 ext/standard/tests/general_functions/floatval.phpt delete mode 100644 ext/standard/tests/general_functions/is_float_64bit.phpt create mode 100644 ext/standard/tests/general_functions/is_float_alias.phpt delete mode 100644 ext/standard/tests/general_functions/is_int_64bit.phpt create mode 100644 ext/standard/tests/general_functions/is_int_aliases.phpt diff --git a/Zend/tests/type_declarations/union_types/incdec_prop.phpt b/Zend/tests/type_declarations/union_types/incdec_prop.phpt index dde6f595264a..7b61fc9fe60c 100644 --- a/Zend/tests/type_declarations/union_types/incdec_prop.phpt +++ b/Zend/tests/type_declarations/union_types/incdec_prop.phpt @@ -13,40 +13,40 @@ class Test { $test = new Test; $test->prop = PHP_INT_MAX; $x = $test->prop++; -var_dump(is_double($test->prop)); +var_dump(is_float($test->prop)); $test->prop = PHP_INT_MAX; $x = ++$test->prop; -var_dump(is_double($test->prop)); +var_dump(is_float($test->prop)); $test->prop = PHP_INT_MIN; $x = $test->prop--; -var_dump(is_double($test->prop)); +var_dump(is_float($test->prop)); $test->prop = PHP_INT_MIN; $x = --$test->prop; -var_dump(is_double($test->prop)); +var_dump(is_float($test->prop)); $test = new Test; $test->prop = PHP_INT_MAX; $r =& $test->prop; $x = $test->prop++; -var_dump(is_double($test->prop)); +var_dump(is_float($test->prop)); $test->prop = PHP_INT_MAX; $x = ++$test->prop; $r =& $test->prop; -var_dump(is_double($test->prop)); +var_dump(is_float($test->prop)); $test->prop = PHP_INT_MIN; $x = $test->prop--; $r =& $test->prop; -var_dump(is_double($test->prop)); +var_dump(is_float($test->prop)); $test->prop = PHP_INT_MIN; $x = --$test->prop; $r =& $test->prop; -var_dump(is_double($test->prop)); +var_dump(is_float($test->prop)); /* Incrementing a non-int|float property past int min/max is an error, * even if the result of the overflow (a float) would technically be allowed diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index e27203d2984f..8ada226729bd 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -5387,14 +5387,9 @@ static zend_result zend_try_compile_special_func_ex(znode *result, zend_string * return zend_compile_func_typecheck(result, args, IS_NULL); } else if (zend_string_equals_literal(lcname, "is_bool")) { return zend_compile_func_typecheck(result, args, _IS_BOOL); - } else if (zend_string_equals_literal(lcname, "is_long") - || zend_string_equals_literal(lcname, "is_int") - || zend_string_equals_literal(lcname, "is_integer") - ) { + } else if (zend_string_equals_literal(lcname, "is_int")) { return zend_compile_func_typecheck(result, args, IS_LONG); - } else if (zend_string_equals_literal(lcname, "is_float") - || zend_string_equals_literal(lcname, "is_double") - ) { + } else if (zend_string_equals_literal(lcname, "is_float")) { return zend_compile_func_typecheck(result, args, IS_DOUBLE); } else if (zend_string_equals_literal(lcname, "is_string")) { return zend_compile_func_typecheck(result, args, IS_STRING); @@ -5410,9 +5405,7 @@ static zend_result zend_try_compile_special_func_ex(znode *result, zend_string * return zend_compile_func_cast(result, args, _IS_BOOL); } else if (zend_string_equals_literal(lcname, "intval")) { return zend_compile_func_cast(result, args, IS_LONG); - } else if (zend_string_equals_literal(lcname, "floatval") - || zend_string_equals_literal(lcname, "doubleval") - ) { + } else if (zend_string_equals_literal(lcname, "floatval")) { return zend_compile_func_cast(result, args, IS_DOUBLE); } else if (zend_string_equals_literal(lcname, "strval")) { return zend_compile_func_cast(result, args, IS_STRING); diff --git a/ext/date/tests/strtotime-mysql-64bit.phpt b/ext/date/tests/strtotime-mysql-64bit.phpt index ddf1dfff3fdf..ddc270cb9b16 100644 --- a/ext/date/tests/strtotime-mysql-64bit.phpt +++ b/ext/date/tests/strtotime-mysql-64bit.phpt @@ -14,7 +14,7 @@ $d[] = '20800410101010'; // overflow.. foreach($d as $date) { $time = strtotime($date); - if (is_integer($time)) { + if (is_int($time)) { var_dump(date('r', $time)); } else { var_dump($time); diff --git a/ext/date/tests/strtotime-mysql.phpt b/ext/date/tests/strtotime-mysql.phpt index c51f63f1323b..629165aa8733 100644 --- a/ext/date/tests/strtotime-mysql.phpt +++ b/ext/date/tests/strtotime-mysql.phpt @@ -14,7 +14,7 @@ $d[] = '20800410101010'; // overflow.. foreach($d as $date) { $time = strtotime($date); - if (is_integer($time)) { + if (is_int($time)) { var_dump(date('r', $time)); } else { var_dump($time); diff --git a/ext/date/tests/strtotime3-64bit.phpt b/ext/date/tests/strtotime3-64bit.phpt index c4f87c3b1a6a..d9dff3bc484d 100644 --- a/ext/date/tests/strtotime3-64bit.phpt +++ b/ext/date/tests/strtotime3-64bit.phpt @@ -36,7 +36,7 @@ $strs = array( foreach ($strs as $str) { $t = strtotime($str, $time); - if (is_integer($t)) { + if (is_int($t)) { var_dump(date(DATE_RFC2822, $t)); } else { var_dump($t); diff --git a/ext/date/tests/strtotime3.phpt b/ext/date/tests/strtotime3.phpt index 763b77a07da9..c96e07ca26e5 100644 --- a/ext/date/tests/strtotime3.phpt +++ b/ext/date/tests/strtotime3.phpt @@ -36,7 +36,7 @@ $strs = array( foreach ($strs as $str) { $t = strtotime($str, $time); - if (is_integer($t)) { + if (is_int($t)) { var_dump(date(DATE_RFC2822, $t)); } else { var_dump($t); diff --git a/ext/filter/tests/046.phpt b/ext/filter/tests/046.phpt index 295369e56f5f..ee95f5494ed6 100644 --- a/ext/filter/tests/046.phpt +++ b/ext/filter/tests/046.phpt @@ -24,7 +24,7 @@ default: function test_validation($val, $msg) { $f = filter_var($val, FILTER_VALIDATE_INT); echo "$msg filtered: "; var_dump($f); // filtered value (or false) - echo "$msg is_long: "; var_dump(is_long($f)); // test validation + echo "$msg is_int: "; var_dump(is_int($f)); // test validation echo "$msg equal: "; var_dump($val == $f); // test equality of result } @@ -36,14 +36,14 @@ test_validation($underflow, "underflow"); ?> --EXPECTF-- max filtered: int(%d) -max is_long: bool(true) +max is_int: bool(true) max equal: bool(true) overflow filtered: bool(false) -overflow is_long: bool(false) +overflow is_int: bool(false) overflow equal: bool(false) min filtered: int(-%d) -min is_long: bool(true) +min is_int: bool(true) min equal: bool(true) underflow filtered: bool(false) -underflow is_long: bool(false) +underflow is_int: bool(false) underflow equal: bool(false) diff --git a/ext/filter/tests/047.phpt b/ext/filter/tests/047.phpt index 763b64e837ed..76471e827628 100644 --- a/ext/filter/tests/047.phpt +++ b/ext/filter/tests/047.phpt @@ -19,13 +19,13 @@ function octal_inc($s) { $s = sprintf("%o", PHP_INT_MAX); -var_dump(is_long(filter_var('0'.$s, FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_OCTAL)))); +var_dump(is_int(filter_var('0'.$s, FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_OCTAL)))); $s = octal_inc($s); -var_dump(is_long(filter_var('0'.$s, FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_OCTAL)))); +var_dump(is_int(filter_var('0'.$s, FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_OCTAL)))); $s = sprintf("%o", ~0); -var_dump(is_long(filter_var('0'.$s, FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_OCTAL)))); +var_dump(is_int(filter_var('0'.$s, FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_OCTAL)))); $s = octal_inc($s); var_dump(filter_var('0'.$s, FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_OCTAL))); diff --git a/ext/filter/tests/048.phpt b/ext/filter/tests/048.phpt index 7191726e3c97..a46d45455992 100644 --- a/ext/filter/tests/048.phpt +++ b/ext/filter/tests/048.phpt @@ -23,13 +23,13 @@ function hex_inc($s) { $s = sprintf("%x", PHP_INT_MAX); -var_dump(is_long(filter_var('0x'.$s, FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_HEX)))); +var_dump(is_int(filter_var('0x'.$s, FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_HEX)))); $s = hex_inc($s); -var_dump(is_long(filter_var('0x'.$s, FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_HEX)))); +var_dump(is_int(filter_var('0x'.$s, FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_HEX)))); $s = sprintf("%x", ~0); -var_dump(is_long(filter_var('0x'.$s, FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_HEX)))); +var_dump(is_int(filter_var('0x'.$s, FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_HEX)))); $s = hex_inc($s); var_dump(filter_var('0x'.$s, FILTER_VALIDATE_INT, array("flags"=>FILTER_FLAG_ALLOW_HEX))); diff --git a/ext/pgsql/tests/20pg_get_pid.phpt b/ext/pgsql/tests/20pg_get_pid.phpt index 3cad32c838ff..5416afb476fa 100644 --- a/ext/pgsql/tests/20pg_get_pid.phpt +++ b/ext/pgsql/tests/20pg_get_pid.phpt @@ -13,7 +13,7 @@ include('inc/config.inc'); $db = pg_connect($conn_str); $pid = pg_get_pid($db); -is_integer($pid) ? print 'OK' : print 'NG'; +is_int($pid) ? print 'OK' : print 'NG'; ?> --EXPECT-- OK diff --git a/ext/posix/tests/posix_getsid.phpt b/ext/posix/tests/posix_getsid.phpt index fbf045711f97..fde7e237d699 100644 --- a/ext/posix/tests/posix_getsid.phpt +++ b/ext/posix/tests/posix_getsid.phpt @@ -14,7 +14,7 @@ echo "*** Testing posix_getsid() : function test ***\n"; $pid = posix_getpid(); echo "\n-- Testing posix_getsid() function with current process pid --\n"; -var_dump( is_long(posix_getsid($pid)) ); +var_dump( is_int(posix_getsid($pid)) ); ?> --EXPECT-- diff --git a/ext/spl/tests/regexiterator_getpregflags.phpt b/ext/spl/tests/regexiterator_getpregflags.phpt index 2fe492aebeb9..7e58dd47b416 100644 --- a/ext/spl/tests/regexiterator_getpregflags.phpt +++ b/ext/spl/tests/regexiterator_getpregflags.phpt @@ -26,8 +26,8 @@ $r = new TestRegexIterator(new myIterator, $rege); $r->setPregFlags(PREG_OFFSET_CAPTURE); -echo is_long($r->getPregFlags()); +var_dump(is_int($r->getPregFlags())); ?> --EXPECT-- -1 +bool(true) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 07e61957d191..ae3c9065cb18 100644 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -3634,6 +3634,7 @@ function intval(mixed $value, int $base = 10): int {} function floatval(mixed $value): float {} /** @alias floatval */ +#[\Deprecated(message: "use floatval() instead", since: "8.6")] function doubleval(mixed $value): float {} /** @@ -3667,9 +3668,11 @@ function is_bool(mixed $value): bool {} function is_int(mixed $value): bool {} /** @alias is_int */ +#[\Deprecated(message: "use is_int() instead", since: "8.6")] function is_integer(mixed $value): bool {} /** @alias is_int */ +#[\Deprecated(message: "use is_int() instead", since: "8.6")] function is_long(mixed $value): bool {} /** @@ -3678,6 +3681,7 @@ function is_long(mixed $value): bool {} function is_float(mixed $value): bool {} /** @alias is_float */ +#[\Deprecated(message: "use is_float() instead", since: "8.6")] function is_double(mixed $value): bool {} /** diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index d24de1fef99d..91e1cb532768 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: 0c8af3b78b3d6e1ee3e59c60363d0d941bea9faa + * Stub hash: 7a3bb062cb216bd28c1c97c44f2f611992c47063 * Has decl header: yes */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) @@ -3479,17 +3479,17 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(settype, arginfo_settype) ZEND_RAW_FENTRY("intval", zif_intval, arginfo_intval, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) ZEND_RAW_FENTRY("floatval", zif_floatval, arginfo_floatval, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) - ZEND_RAW_FENTRY("doubleval", zif_floatval, arginfo_doubleval, 0, NULL, NULL) + ZEND_RAW_FENTRY("doubleval", zif_floatval, arginfo_doubleval, ZEND_ACC_DEPRECATED, NULL, NULL) ZEND_RAW_FENTRY("boolval", zif_boolval, arginfo_boolval, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) ZEND_RAW_FENTRY("strval", zif_strval, arginfo_strval, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) ZEND_RAW_FENTRY("is_null", zif_is_null, arginfo_is_null, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) ZEND_RAW_FENTRY("is_resource", zif_is_resource, arginfo_is_resource, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) ZEND_RAW_FENTRY("is_bool", zif_is_bool, arginfo_is_bool, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) ZEND_RAW_FENTRY("is_int", zif_is_int, arginfo_is_int, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) - ZEND_RAW_FENTRY("is_integer", zif_is_int, arginfo_is_integer, 0, NULL, NULL) - ZEND_RAW_FENTRY("is_long", zif_is_int, arginfo_is_long, 0, NULL, NULL) + ZEND_RAW_FENTRY("is_integer", zif_is_int, arginfo_is_integer, ZEND_ACC_DEPRECATED, NULL, NULL) + ZEND_RAW_FENTRY("is_long", zif_is_int, arginfo_is_long, ZEND_ACC_DEPRECATED, NULL, NULL) ZEND_RAW_FENTRY("is_float", zif_is_float, arginfo_is_float, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) - ZEND_RAW_FENTRY("is_double", zif_is_float, arginfo_is_double, 0, NULL, NULL) + ZEND_RAW_FENTRY("is_double", zif_is_float, arginfo_is_double, ZEND_ACC_DEPRECATED, NULL, NULL) ZEND_RAW_FENTRY("is_numeric", zif_is_numeric, arginfo_is_numeric, ZEND_ACC_COMPILE_TIME_EVAL, frameless_function_infos_is_numeric, NULL) ZEND_RAW_FENTRY("is_string", zif_is_string, arginfo_is_string, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) ZEND_RAW_FENTRY("is_array", zif_is_array, arginfo_is_array, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) @@ -3974,6 +3974,34 @@ static void register_basic_functions_symbols(int module_number) attribute_Deprecated_func_socket_set_timeout_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE); #endif + zend_attribute *attribute_Deprecated_func_doubleval_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "doubleval", sizeof("doubleval") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2); + zend_string *attribute_Deprecated_func_doubleval_0_arg0_str = zend_string_init("use floatval() instead", strlen("use floatval() instead"), 1); + ZVAL_STR(&attribute_Deprecated_func_doubleval_0->args[0].value, attribute_Deprecated_func_doubleval_0_arg0_str); + attribute_Deprecated_func_doubleval_0->args[0].name = ZSTR_KNOWN(ZEND_STR_MESSAGE); + zend_string *attribute_Deprecated_func_doubleval_0_arg1_str = zend_string_init("8.6", strlen("8.6"), 1); + ZVAL_STR(&attribute_Deprecated_func_doubleval_0->args[1].value, attribute_Deprecated_func_doubleval_0_arg1_str); + attribute_Deprecated_func_doubleval_0->args[1].name = ZSTR_KNOWN(ZEND_STR_SINCE); + + zend_attribute *attribute_Deprecated_func_is_integer_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "is_integer", sizeof("is_integer") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2); + zend_string *attribute_Deprecated_func_is_integer_0_arg0_str = zend_string_init("use is_int() instead", strlen("use is_int() instead"), 1); + ZVAL_STR(&attribute_Deprecated_func_is_integer_0->args[0].value, attribute_Deprecated_func_is_integer_0_arg0_str); + attribute_Deprecated_func_is_integer_0->args[0].name = ZSTR_KNOWN(ZEND_STR_MESSAGE); + ZVAL_STR_COPY(&attribute_Deprecated_func_is_integer_0->args[1].value, attribute_Deprecated_func_doubleval_0_arg1_str); + attribute_Deprecated_func_is_integer_0->args[1].name = ZSTR_KNOWN(ZEND_STR_SINCE); + + zend_attribute *attribute_Deprecated_func_is_long_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "is_long", sizeof("is_long") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2); + ZVAL_STR_COPY(&attribute_Deprecated_func_is_long_0->args[0].value, attribute_Deprecated_func_is_integer_0_arg0_str); + attribute_Deprecated_func_is_long_0->args[0].name = ZSTR_KNOWN(ZEND_STR_MESSAGE); + ZVAL_STR_COPY(&attribute_Deprecated_func_is_long_0->args[1].value, attribute_Deprecated_func_doubleval_0_arg1_str); + attribute_Deprecated_func_is_long_0->args[1].name = ZSTR_KNOWN(ZEND_STR_SINCE); + + zend_attribute *attribute_Deprecated_func_is_double_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "is_double", sizeof("is_double") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2); + zend_string *attribute_Deprecated_func_is_double_0_arg0_str = zend_string_init("use is_float() instead", strlen("use is_float() instead"), 1); + ZVAL_STR(&attribute_Deprecated_func_is_double_0->args[0].value, attribute_Deprecated_func_is_double_0_arg0_str); + attribute_Deprecated_func_is_double_0->args[0].name = ZSTR_KNOWN(ZEND_STR_MESSAGE); + ZVAL_STR_COPY(&attribute_Deprecated_func_is_double_0->args[1].value, attribute_Deprecated_func_doubleval_0_arg1_str); + attribute_Deprecated_func_is_double_0->args[1].name = ZSTR_KNOWN(ZEND_STR_SINCE); + zend_attribute *attribute_Deprecated_const_ASSERT_ACTIVE_0 = zend_add_global_constant_attribute(const_ASSERT_ACTIVE, ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2); ZVAL_STR(&attribute_Deprecated_const_ASSERT_ACTIVE_0->args[0].value, ZSTR_KNOWN(ZEND_STR_8_DOT_3)); attribute_Deprecated_const_ASSERT_ACTIVE_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE); diff --git a/ext/standard/basic_functions_decl.h b/ext/standard/basic_functions_decl.h index 97d896e8bb6e..ac1e9843da28 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: 0c8af3b78b3d6e1ee3e59c60363d0d941bea9faa */ + * Stub hash: 7a3bb062cb216bd28c1c97c44f2f611992c47063 */ -#ifndef ZEND_BASIC_FUNCTIONS_DECL_0c8af3b78b3d6e1ee3e59c60363d0d941bea9faa_H -#define ZEND_BASIC_FUNCTIONS_DECL_0c8af3b78b3d6e1ee3e59c60363d0d941bea9faa_H +#ifndef ZEND_BASIC_FUNCTIONS_DECL_7a3bb062cb216bd28c1c97c44f2f611992c47063_H +#define ZEND_BASIC_FUNCTIONS_DECL_7a3bb062cb216bd28c1c97c44f2f611992c47063_H typedef enum zend_enum_SortDirection { ZEND_ENUM_SortDirection_Ascending = 1, @@ -20,4 +20,4 @@ typedef enum zend_enum_RoundingMode { ZEND_ENUM_RoundingMode_PositiveInfinity = 8, } zend_enum_RoundingMode; -#endif /* ZEND_BASIC_FUNCTIONS_DECL_0c8af3b78b3d6e1ee3e59c60363d0d941bea9faa_H */ +#endif /* ZEND_BASIC_FUNCTIONS_DECL_7a3bb062cb216bd28c1c97c44f2f611992c47063_H */ diff --git a/ext/standard/tests/general_functions/doubleval.phpt b/ext/standard/tests/general_functions/doubleval.phpt new file mode 100644 index 000000000000..a3e083501fbf --- /dev/null +++ b/ext/standard/tests/general_functions/doubleval.phpt @@ -0,0 +1,50 @@ +--TEST-- +Deprecated doubleval() alias +--INI-- +precision = 14 +--FILE-- + +--EXPECTF-- +Deprecated: Function doubleval() is deprecated since 8.6, use floatval() instead in %s on line %d +bool(true) + +Deprecated: Function doubleval() is deprecated since 8.6, use floatval() instead in %s on line %d +bool(true) + +Deprecated: Function doubleval() is deprecated since 8.6, use floatval() instead in %s on line %d +bool(true) + +Deprecated: Function doubleval() is deprecated since 8.6, use floatval() instead in %s on line %d +bool(true) + +Deprecated: Function doubleval() is deprecated since 8.6, use floatval() instead in %s on line %d +bool(true) + +Deprecated: Function doubleval() is deprecated since 8.6, use floatval() instead in %s on line %d +bool(true) + +Deprecated: Function doubleval() is deprecated since 8.6, use floatval() instead in %s on line %d +bool(true) + +Deprecated: Function doubleval() is deprecated since 8.6, use floatval() instead in %s on line %d + +Warning: Object of class stdClass could not be converted to float in %s on line %d + +Warning: Object of class stdClass could not be converted to float in %s on line %d +bool(true) diff --git a/ext/standard/tests/general_functions/floatval.phpt b/ext/standard/tests/general_functions/floatval.phpt deleted file mode 100644 index 9ff49bb01084..000000000000 --- a/ext/standard/tests/general_functions/floatval.phpt +++ /dev/null @@ -1,171 +0,0 @@ ---TEST-- -Testing floatval() and its alias doubleval() Functions ---FILE-- - ---EXPECTF-- -*** Testing floatval() with valid float values *** -float(0) -float(1) -float(-1) -float(1.234) -float(-1.234) -float(1200) -float(-1200) -float(10) -float(1050000) -float(100000) -float(-100000) -float(1.0E-5) -float(-0.1) -float(100000) -float(-100000) -float(100000) -float(-100000) -float(100000) -float(-100000) -float(5000000) -float(-5000000) - -*** Testing doubleval() with valid float values *** -float(0) -float(1) -float(-1) -float(1.234) -float(-1.234) -float(1200) -float(-1200) -float(10) -float(1050000) -float(100000) -float(-100000) -float(1.0E-5) -float(-0.1) -float(100000) -float(-100000) -float(100000) -float(-100000) -float(100000) -float(-100000) -float(5000000) -float(-5000000) - -*** Testing floatval() on non floating types *** - -Warning: A non-numeric value encountered in %s on line %d - -Warning: A non-numeric value encountered in %s on line %d -float(-2147483648) -float(2147483648) -float(3) -float(0) -float(1) -float(-1300) -float(0) -float(10) -float(10.2) -float(11) -float(11) -float(0) -float(1) -float(0) -float(0) - -*** Testing doubleval() on non floating types *** -float(-2147483648) -float(2147483648) -float(3) -float(0) -float(1) -float(-1300) -float(0) -float(10) -float(10.2) -float(11) -float(11) -float(0) -float(1) -float(0) -float(0) - -Done diff --git a/ext/standard/tests/general_functions/floatval_basic.phpt b/ext/standard/tests/general_functions/floatval_basic.phpt index d20d4dedfaaf..c6de09853c2b 100644 --- a/ext/standard/tests/general_functions/floatval_basic.phpt +++ b/ext/standard/tests/general_functions/floatval_basic.phpt @@ -1,33 +1,33 @@ --TEST-- -Testing floatval() and its alias doubleval() Functions +Testing floatval() with floats --INI-- -precision = 14 +precision=14 --FILE-- 0.0, - "1.0" => 1.0, - "-1.0" => -1.0, - "1.234" => 1.234, - "-1.234" => -1.234, - "1.2e3" => 1.2e3, - "-1.2e3" => -1.2e3, - "10.0000000000000000005" => 10.0000000000000000005, - "10.5e+5" => 10.5e+5, - "1e5" => 1e5, - "-1e5" => -1e5, - "1e5" => 1e-5, - "-1e-1" => -1e-1, - "1e+5" => 1e+5, - "-1e+5" =>-1e+5, - "1E5" => 1E5, - "-1E5" => -1E5, - "1E+5" => 1E+5, - "-1E5" => -1E+5, - ".5e+7" => .5e+7, - "-.5e+7" =>-.5e+7 -); +$valid_floats = [ + "0.0" => 0.0, + "1.0" => 1.0, + "-1.0" => -1.0, + "1.234" => 1.234, + "-1.234" => -1.234, + "1.2e3" => 1.2e3, + "-1.2e3" => -1.2e3, + "10.0000000000000000005" => 10.0000000000000000005, + "10.5e+5" => 10.5e+5, + "1e5" => 1e5, + "-1e5" => -1e5, + "1e5" => 1e-5, + "-1e-1" => -1e-1, + "1e+5" => 1e+5, + "-1e+5" =>-1e+5, + "1E5" => 1E5, + "-1E5" => -1E5, + "1E+5" => 1E+5, + "-1E5" => -1E+5, + ".5e+7" => .5e+7, + "-.5e+7" =>-.5e+7 +]; /* loop to check that floatval() recognizes different float values, expected output:float value for valid floating point number */ @@ -37,14 +37,6 @@ foreach ($valid_floats as $key => $value ) { var_dump( floatval($value) ); } -/* loop to check that doubleval() also recognizes different - float values, expected output:float value for valid floating point number */ -echo "\n*** Testing doubleval() with valid float values ***\n"; -foreach ($valid_floats as $key => $value ) { - echo "\n-- Iteration : $key -- \n"; - var_dump( doubleval($value) ); -} - ?> --EXPECT-- *** Testing floatval() with valid float values *** @@ -105,62 +97,3 @@ float(5000000) -- Iteration : -.5e+7 -- float(-5000000) - -*** Testing doubleval() with valid float values *** - --- Iteration : 0.0 -- -float(0) - --- Iteration : 1.0 -- -float(1) - --- Iteration : -1.0 -- -float(-1) - --- Iteration : 1.234 -- -float(1.234) - --- Iteration : -1.234 -- -float(-1.234) - --- Iteration : 1.2e3 -- -float(1200) - --- Iteration : -1.2e3 -- -float(-1200) - --- Iteration : 10.0000000000000000005 -- -float(10) - --- Iteration : 10.5e+5 -- -float(1050000) - --- Iteration : 1e5 -- -float(1.0E-5) - --- Iteration : -1e5 -- -float(-100000) - --- Iteration : -1e-1 -- -float(-0.1) - --- Iteration : 1e+5 -- -float(100000) - --- Iteration : -1e+5 -- -float(-100000) - --- Iteration : 1E5 -- -float(100000) - --- Iteration : -1E5 -- -float(-100000) - --- Iteration : 1E+5 -- -float(100000) - --- Iteration : .5e+7 -- -float(5000000) - --- Iteration : -.5e+7 -- -float(-5000000) diff --git a/ext/standard/tests/general_functions/floatval_variation1.phpt b/ext/standard/tests/general_functions/floatval_variation1.phpt index 032d089b01c4..1759691aa21b 100644 --- a/ext/standard/tests/general_functions/floatval_variation1.phpt +++ b/ext/standard/tests/general_functions/floatval_variation1.phpt @@ -1,25 +1,28 @@ --TEST-- -Testing floatval() and its alias doubleval() functions : usage variations - different data types as $y arg +Testing floatval() different data types as arg +--INI-- +precision=14 --FILE-- -2147483648, // max negative integer value - "2147483647" => 2147483648, // max positive integer value - "stream resource" => STDERR, - "\"0.0\"" => "0.0", // string - "\"1.0\"" => "1.0", - "\"-1.3e3\"" => "-1.3e3", - "\"bob-1.3e3\"" => "bob-1.3e3", - "\"10 Some dollars\"" => "10 Some dollars", - "\"10.2 Some Dollars\"" => "10.2 Some Dollars", - "\"10.0 dollar\" + 1" => "10.0 dollar" + 1, - "\"10.0 dollar\" + 1.0" => "10.0 dollar" + 1.0, - "\"\"" => "", - "true" => true, - "null" => null, - ); +$not_float_types = [ + "-2147483648" => -2147483648, // max negative integer value + "2147483647" => 2147483648, // max positive integer value + "stream resource" => STDERR, + "\"0.0\"" => "0.0", // string + "\"1.0\"" => "1.0", + "\"-1.3e3\"" => "-1.3e3", + "\"bob-1.3e3\"" => "bob-1.3e3", + "\"10 Some dollars\"" => "10 Some dollars", + "\"10.2 Some Dollars\"" => "10.2 Some Dollars", + "\"10.0 dollar\" + 1" => "10.0 dollar" + 1, + "\"10.0 dollar\" + 1.0" => "10.0 dollar" + 1.0, + "\"\"" => "", + "true" => true, + "false" => false, + "null" => null, +]; /* loop through the $not_float_types to see working of floatval() on non float types, expected output: float value valid floating point numbers */ echo "\n*** Testing floatval() on non floating types ***\n"; @@ -28,14 +31,6 @@ foreach ($not_float_types as $key => $type ) { var_dump( floatval($type) ); } -echo "\n*** Testing doubleval() on non floating types ***\n"; - -/* loop through the $not_float_types to see working of - doubleval() on non float types, expected output: float value valid floating point numbers */ -foreach ($not_float_types as $key => $type ) { - echo "\n-- Iteration : $key --\n"; - var_dump( doubleval($type) ); -} ?> --EXPECTF-- Warning: A non-numeric value encountered in %s on line %d @@ -83,49 +78,8 @@ float(0) -- Iteration : true -- float(1) --- Iteration : null -- -float(0) - -*** Testing doubleval() on non floating types *** - --- Iteration : -2147483648 -- -float(-2147483648) - --- Iteration : 2147483647 -- -float(2147483648) - --- Iteration : stream resource -- -float(3) - --- Iteration : "0.0" -- -float(0) - --- Iteration : "1.0" -- -float(1) - --- Iteration : "-1.3e3" -- -float(-1300) - --- Iteration : "bob-1.3e3" -- +-- Iteration : false -- float(0) --- Iteration : "10 Some dollars" -- -float(10) - --- Iteration : "10.2 Some Dollars" -- -float(10.2) - --- Iteration : "10.0 dollar" + 1 -- -float(11) - --- Iteration : "10.0 dollar" + 1.0 -- -float(11) - --- Iteration : "" -- -float(0) - --- Iteration : true -- -float(1) - -- Iteration : null -- float(0) diff --git a/ext/standard/tests/general_functions/is_float.phpt b/ext/standard/tests/general_functions/is_float.phpt index e951ebe633c4..38e08cb19c06 100644 --- a/ext/standard/tests/general_functions/is_float.phpt +++ b/ext/standard/tests/general_functions/is_float.phpt @@ -1,20 +1,12 @@ --TEST-- -Test is_float() & its is_double() alias ---SKIPIF-- - +Test is_float() --FILE-- --EXPECT-- -*** Testing is_float(), is_double() with float values*** --- Iteration 1 -- -bool(true) -bool(true) --- Iteration 2 -- -bool(true) -bool(true) --- Iteration 3 -- -bool(true) -bool(true) --- Iteration 4 -- -bool(true) -bool(true) --- Iteration 5 -- -bool(true) -bool(true) --- Iteration 6 -- -bool(true) -bool(true) --- Iteration 7 -- -bool(true) -bool(true) --- Iteration 8 -- -bool(true) -bool(true) --- Iteration 9 -- -bool(true) -bool(true) --- Iteration 10 -- -bool(true) -bool(true) --- Iteration 11 -- -bool(true) -bool(true) --- Iteration 12 -- -bool(true) -bool(true) --- Iteration 13 -- -bool(true) -bool(true) --- Iteration 14 -- -bool(true) -bool(true) --- Iteration 15 -- -bool(true) -bool(true) --- Iteration 16 -- -bool(true) -bool(true) --- Iteration 17 -- -bool(true) -bool(true) --- Iteration 18 -- -bool(true) -bool(true) --- Iteration 19 -- -bool(true) -bool(true) --- Iteration 20 -- -bool(true) -bool(true) --- Iteration 21 -- -bool(true) -bool(true) --- Iteration 22 -- -bool(true) -bool(true) --- Iteration 23 -- -bool(true) -bool(true) --- Iteration 24 -- -bool(true) -bool(true) --- Iteration 25 -- -bool(true) -bool(true) --- Iteration 26 -- -bool(true) -bool(true) --- Iteration 27 -- -bool(true) -bool(true) --- Iteration 28 -- -bool(true) -bool(true) --- Iteration 29 -- -bool(true) -bool(true) --- Iteration 30 -- -bool(true) -bool(true) - -*** Testing is_float(), is_double() with non float values *** ---Iteration 1-- -bool(false) -bool(false) ---Iteration 2-- -bool(false) -bool(false) ---Iteration 3-- -bool(false) -bool(false) ---Iteration 4-- -bool(false) -bool(false) ---Iteration 5-- -bool(false) -bool(false) ---Iteration 6-- -bool(false) -bool(false) ---Iteration 7-- -bool(false) -bool(false) ---Iteration 8-- -bool(false) -bool(false) ---Iteration 9-- -bool(false) -bool(false) ---Iteration 10-- -bool(false) -bool(false) ---Iteration 11-- -bool(false) -bool(false) ---Iteration 12-- -bool(false) -bool(false) ---Iteration 13-- -bool(false) -bool(false) ---Iteration 14-- -bool(false) -bool(false) ---Iteration 15-- -bool(false) -bool(false) ---Iteration 16-- -bool(false) -bool(false) ---Iteration 17-- -bool(false) -bool(false) ---Iteration 18-- -bool(false) -bool(false) ---Iteration 19-- -bool(false) -bool(false) ---Iteration 20-- -bool(false) -bool(false) ---Iteration 21-- -bool(false) -bool(false) ---Iteration 22-- -bool(false) -bool(false) ---Iteration 23-- -bool(false) -bool(false) ---Iteration 24-- -bool(false) -bool(false) ---Iteration 25-- -bool(false) -bool(false) ---Iteration 26-- -bool(false) -bool(false) ---Iteration 27-- -bool(false) -bool(false) ---Iteration 28-- -bool(false) -bool(false) ---Iteration 29-- -bool(false) -bool(false) ---Iteration 30-- -bool(false) -bool(false) ---Iteration 31-- -bool(false) -bool(false) ---Iteration 32-- -bool(false) -bool(false) ---Iteration 33-- -bool(false) -bool(false) ---Iteration 34-- -bool(false) -bool(false) ---Iteration 35-- -bool(false) -bool(false) ---Iteration 36-- -bool(false) -bool(false) ---Iteration 37-- -bool(false) -bool(false) Done diff --git a/ext/standard/tests/general_functions/is_float_64bit.phpt b/ext/standard/tests/general_functions/is_float_64bit.phpt deleted file mode 100644 index 93fcc0949bbe..000000000000 --- a/ext/standard/tests/general_functions/is_float_64bit.phpt +++ /dev/null @@ -1,333 +0,0 @@ ---TEST-- -Test is_float() & its is_double() alias ---SKIPIF-- - ---INI-- -precision=14 ---FILE-- - ---EXPECT-- -*** Testing is_float(), is_double() with float values*** --- Iteration 1 -- -bool(false) -bool(false) --- Iteration 2 -- -bool(false) -bool(false) --- Iteration 3 -- -bool(false) -bool(false) --- Iteration 4 -- -bool(false) -bool(false) --- Iteration 5 -- -bool(false) -bool(false) --- Iteration 6 -- -bool(false) -bool(false) --- Iteration 7 -- -bool(true) -bool(true) --- Iteration 8 -- -bool(true) -bool(true) --- Iteration 9 -- -bool(true) -bool(true) --- Iteration 10 -- -bool(true) -bool(true) --- Iteration 11 -- -bool(true) -bool(true) --- Iteration 12 -- -bool(true) -bool(true) --- Iteration 13 -- -bool(true) -bool(true) --- Iteration 14 -- -bool(true) -bool(true) --- Iteration 15 -- -bool(true) -bool(true) --- Iteration 16 -- -bool(true) -bool(true) --- Iteration 17 -- -bool(true) -bool(true) --- Iteration 18 -- -bool(true) -bool(true) --- Iteration 19 -- -bool(true) -bool(true) --- Iteration 20 -- -bool(true) -bool(true) --- Iteration 21 -- -bool(true) -bool(true) --- Iteration 22 -- -bool(true) -bool(true) --- Iteration 23 -- -bool(true) -bool(true) --- Iteration 24 -- -bool(true) -bool(true) --- Iteration 25 -- -bool(true) -bool(true) --- Iteration 26 -- -bool(true) -bool(true) --- Iteration 27 -- -bool(true) -bool(true) --- Iteration 28 -- -bool(true) -bool(true) --- Iteration 29 -- -bool(true) -bool(true) --- Iteration 30 -- -bool(true) -bool(true) - -*** Testing is_float(), is_double() with non float values *** ---Iteration 1-- -bool(false) -bool(false) ---Iteration 2-- -bool(false) -bool(false) ---Iteration 3-- -bool(false) -bool(false) ---Iteration 4-- -bool(false) -bool(false) ---Iteration 5-- -bool(false) -bool(false) ---Iteration 6-- -bool(false) -bool(false) ---Iteration 7-- -bool(false) -bool(false) ---Iteration 8-- -bool(false) -bool(false) ---Iteration 9-- -bool(false) -bool(false) ---Iteration 10-- -bool(false) -bool(false) ---Iteration 11-- -bool(false) -bool(false) ---Iteration 12-- -bool(false) -bool(false) ---Iteration 13-- -bool(false) -bool(false) ---Iteration 14-- -bool(false) -bool(false) ---Iteration 15-- -bool(false) -bool(false) ---Iteration 16-- -bool(false) -bool(false) ---Iteration 17-- -bool(false) -bool(false) ---Iteration 18-- -bool(false) -bool(false) ---Iteration 19-- -bool(false) -bool(false) ---Iteration 20-- -bool(false) -bool(false) ---Iteration 21-- -bool(false) -bool(false) ---Iteration 22-- -bool(false) -bool(false) ---Iteration 23-- -bool(false) -bool(false) ---Iteration 24-- -bool(false) -bool(false) ---Iteration 25-- -bool(false) -bool(false) ---Iteration 26-- -bool(false) -bool(false) ---Iteration 27-- -bool(false) -bool(false) ---Iteration 28-- -bool(false) -bool(false) ---Iteration 29-- -bool(false) -bool(false) ---Iteration 30-- -bool(false) -bool(false) ---Iteration 31-- -bool(false) -bool(false) ---Iteration 32-- -bool(false) -bool(false) ---Iteration 33-- -bool(false) -bool(false) ---Iteration 34-- -bool(false) -bool(false) ---Iteration 35-- -bool(false) -bool(false) ---Iteration 36-- -bool(false) -bool(false) ---Iteration 37-- -bool(false) -bool(false) -Done diff --git a/ext/standard/tests/general_functions/is_float_alias.phpt b/ext/standard/tests/general_functions/is_float_alias.phpt new file mode 100644 index 000000000000..db74a7e1298b --- /dev/null +++ b/ext/standard/tests/general_functions/is_float_alias.phpt @@ -0,0 +1,12 @@ +--TEST-- +Test deprecated is_double aliases for is_float() + +--FILE-- + +--EXPECTF-- +Deprecated: Function is_double() is deprecated since 8.6, use is_float() instead in %s on line %d +bool(true) diff --git a/ext/standard/tests/general_functions/is_int.phpt b/ext/standard/tests/general_functions/is_int.phpt index 6dfcf9e1b422..3ec22708d803 100644 --- a/ext/standard/tests/general_functions/is_int.phpt +++ b/ext/standard/tests/general_functions/is_int.phpt @@ -1,62 +1,27 @@ --TEST-- -Test is_int() & it's FALIASes: is_long() & is_integer() functions ---SKIPIF-- - +Test is_int() --FILE-- "One", "two" => 2), - - /* strings */ - "", + null, + true, // boolean + false, '', - "0", '0', - "1", - '1', - "\x01", - '\x01', - "\01", - '\01', - 'string', - "string", - "true", - "FALSE", - 'false', - 'TRUE', - "NULL", - 'null', + '0.0', + '0.5', + '1e5', + '1.5e6_string', +]; - /* booleans */ - true, - false, - TRUE, - FALSE, - - /* undefined and unset vars */ - @$unset_var, - @$undefined_var -); -/* loop through the $not_int_types to see working of - is_int() on non integer types, expected output: bool(false) */ -$loop_counter = 1; foreach ($not_int_types as $type ) { - echo "--Iteration $loop_counter--\n"; $loop_counter++; - var_dump( is_int($type) ); - var_dump( is_integer($type) ); - var_dump( is_long($type) ); + if (is_int($type)) { + echo "Value $type should not be an int!\n"; + } } echo "Done\n"; -// close the resources -fclose($fp); -closedir($dfp); - ?> --EXPECT-- -*** Testing is_int(), is_integer() & is_long() with valid integer values *** ---Iteration 1-- -bool(true) -bool(true) -bool(true) ---Iteration 2-- -bool(true) -bool(true) -bool(true) ---Iteration 3-- -bool(true) -bool(true) -bool(true) ---Iteration 4-- -bool(false) -bool(false) -bool(false) ---Iteration 5-- -bool(true) -bool(true) -bool(true) ---Iteration 6-- -bool(true) -bool(true) -bool(true) ---Iteration 7-- -bool(true) -bool(true) -bool(true) ---Iteration 8-- -bool(true) -bool(true) -bool(true) ---Iteration 9-- -bool(true) -bool(true) -bool(true) ---Iteration 10-- -bool(true) -bool(true) -bool(true) ---Iteration 11-- -bool(true) -bool(true) -bool(true) ---Iteration 12-- -bool(false) -bool(false) -bool(false) ---Iteration 13-- -bool(true) -bool(true) -bool(true) ---Iteration 14-- -bool(true) -bool(true) -bool(true) ---Iteration 15-- -bool(true) -bool(true) -bool(true) ---Iteration 16-- -bool(true) -bool(true) -bool(true) ---Iteration 17-- -bool(false) -bool(false) -bool(false) ---Iteration 18-- -bool(true) -bool(true) -bool(true) - -*** Testing is_int(), is_integer() & is_long() with non integer values *** ---Iteration 1-- -bool(false) -bool(false) -bool(false) ---Iteration 2-- -bool(false) -bool(false) -bool(false) ---Iteration 3-- -bool(false) -bool(false) -bool(false) ---Iteration 4-- -bool(false) -bool(false) -bool(false) ---Iteration 5-- -bool(false) -bool(false) -bool(false) ---Iteration 6-- -bool(false) -bool(false) -bool(false) ---Iteration 7-- -bool(false) -bool(false) -bool(false) ---Iteration 8-- -bool(false) -bool(false) -bool(false) ---Iteration 9-- -bool(false) -bool(false) -bool(false) ---Iteration 10-- -bool(false) -bool(false) -bool(false) ---Iteration 11-- -bool(false) -bool(false) -bool(false) ---Iteration 12-- -bool(false) -bool(false) -bool(false) ---Iteration 13-- -bool(false) -bool(false) -bool(false) ---Iteration 14-- -bool(false) -bool(false) -bool(false) ---Iteration 15-- -bool(false) -bool(false) -bool(false) ---Iteration 16-- -bool(false) -bool(false) -bool(false) ---Iteration 17-- -bool(false) -bool(false) -bool(false) ---Iteration 18-- -bool(false) -bool(false) -bool(false) ---Iteration 19-- -bool(false) -bool(false) -bool(false) ---Iteration 20-- -bool(false) -bool(false) -bool(false) ---Iteration 21-- -bool(false) -bool(false) -bool(false) ---Iteration 22-- -bool(false) -bool(false) -bool(false) ---Iteration 23-- -bool(false) -bool(false) -bool(false) ---Iteration 24-- -bool(false) -bool(false) -bool(false) ---Iteration 25-- -bool(false) -bool(false) -bool(false) ---Iteration 26-- -bool(false) -bool(false) -bool(false) ---Iteration 27-- -bool(false) -bool(false) -bool(false) ---Iteration 28-- -bool(false) -bool(false) -bool(false) ---Iteration 29-- -bool(false) -bool(false) -bool(false) ---Iteration 30-- -bool(false) -bool(false) -bool(false) ---Iteration 31-- -bool(false) -bool(false) -bool(false) ---Iteration 32-- -bool(false) -bool(false) -bool(false) ---Iteration 33-- -bool(false) -bool(false) -bool(false) ---Iteration 34-- -bool(false) -bool(false) -bool(false) ---Iteration 35-- -bool(false) -bool(false) -bool(false) ---Iteration 36-- -bool(false) -bool(false) -bool(false) ---Iteration 37-- -bool(false) -bool(false) -bool(false) ---Iteration 38-- -bool(false) -bool(false) -bool(false) ---Iteration 39-- -bool(false) -bool(false) -bool(false) ---Iteration 40-- -bool(false) -bool(false) -bool(false) ---Iteration 41-- -bool(false) -bool(false) -bool(false) ---Iteration 42-- -bool(false) -bool(false) -bool(false) ---Iteration 43-- -bool(false) -bool(false) -bool(false) ---Iteration 44-- -bool(false) -bool(false) -bool(false) ---Iteration 45-- -bool(false) -bool(false) -bool(false) ---Iteration 46-- -bool(false) -bool(false) -bool(false) ---Iteration 47-- -bool(false) -bool(false) -bool(false) ---Iteration 48-- -bool(false) -bool(false) -bool(false) ---Iteration 49-- -bool(false) -bool(false) -bool(false) ---Iteration 50-- -bool(false) -bool(false) -bool(false) ---Iteration 51-- -bool(false) -bool(false) -bool(false) ---Iteration 52-- -bool(false) -bool(false) -bool(false) ---Iteration 53-- -bool(false) -bool(false) -bool(false) ---Iteration 54-- -bool(false) -bool(false) -bool(false) Done diff --git a/ext/standard/tests/general_functions/is_int_64bit.phpt b/ext/standard/tests/general_functions/is_int_64bit.phpt deleted file mode 100644 index 9676deea4cd1..000000000000 --- a/ext/standard/tests/general_functions/is_int_64bit.phpt +++ /dev/null @@ -1,427 +0,0 @@ ---TEST-- -Test is_int() & it's FALIASes: is_long() & is_integer() functions ---SKIPIF-- - ---INI-- -precision=14 ---FILE-- - "One", "two" => 2), - - /* strings */ - "", - '', - "0", - '0', - "1", - '1', - "\x01", - '\x01', - "\01", - '\01', - 'string', - "string", - "true", - "FALSE", - 'false', - 'TRUE', - "NULL", - 'null', - - /* booleans */ - true, - false, - TRUE, - FALSE, - - /* undefined and unset vars */ - @$unset_var, - @$undefined_var -); -/* loop through the $not_int_types to see working of - is_int() on non integer types, expected output: bool(false) */ -$loop_counter = 1; -foreach ($not_int_types as $type ) { - echo "--Iteration $loop_counter--\n"; $loop_counter++; - var_dump( is_int($type) ); - var_dump( is_integer($type) ); - var_dump( is_long($type) ); -} - -echo "Done\n"; -?> ---EXPECT-- -*** Testing is_int(), is_integer() & is_long() with valid integer values *** ---Iteration 1-- -bool(true) -bool(true) -bool(true) ---Iteration 2-- -bool(true) -bool(true) -bool(true) ---Iteration 3-- -bool(true) -bool(true) -bool(true) ---Iteration 4-- -bool(true) -bool(true) -bool(true) ---Iteration 5-- -bool(true) -bool(true) -bool(true) ---Iteration 6-- -bool(true) -bool(true) -bool(true) ---Iteration 7-- -bool(true) -bool(true) -bool(true) ---Iteration 8-- -bool(true) -bool(true) -bool(true) ---Iteration 9-- -bool(true) -bool(true) -bool(true) ---Iteration 10-- -bool(true) -bool(true) -bool(true) ---Iteration 11-- -bool(true) -bool(true) -bool(true) ---Iteration 12-- -bool(true) -bool(true) -bool(true) ---Iteration 13-- -bool(true) -bool(true) -bool(true) ---Iteration 14-- -bool(true) -bool(true) -bool(true) ---Iteration 15-- -bool(true) -bool(true) -bool(true) ---Iteration 16-- -bool(true) -bool(true) -bool(true) ---Iteration 17-- -bool(true) -bool(true) -bool(true) ---Iteration 18-- -bool(true) -bool(true) -bool(true) - -*** Testing is_int(), is_integer() & is_long() with non integer values *** ---Iteration 1-- -bool(true) -bool(true) -bool(true) ---Iteration 2-- -bool(true) -bool(true) -bool(true) ---Iteration 3-- -bool(true) -bool(true) -bool(true) ---Iteration 4-- -bool(true) -bool(true) -bool(true) ---Iteration 5-- -bool(true) -bool(true) -bool(true) ---Iteration 6-- -bool(true) -bool(true) -bool(true) ---Iteration 7-- -bool(false) -bool(false) -bool(false) ---Iteration 8-- -bool(false) -bool(false) -bool(false) ---Iteration 9-- -bool(false) -bool(false) -bool(false) ---Iteration 10-- -bool(false) -bool(false) -bool(false) ---Iteration 11-- -bool(false) -bool(false) -bool(false) ---Iteration 12-- -bool(false) -bool(false) -bool(false) ---Iteration 13-- -bool(false) -bool(false) -bool(false) ---Iteration 14-- -bool(false) -bool(false) -bool(false) ---Iteration 15-- -bool(false) -bool(false) -bool(false) ---Iteration 16-- -bool(false) -bool(false) -bool(false) ---Iteration 17-- -bool(false) -bool(false) -bool(false) ---Iteration 18-- -bool(false) -bool(false) -bool(false) ---Iteration 19-- -bool(false) -bool(false) -bool(false) ---Iteration 20-- -bool(false) -bool(false) -bool(false) ---Iteration 21-- -bool(false) -bool(false) -bool(false) ---Iteration 22-- -bool(false) -bool(false) -bool(false) ---Iteration 23-- -bool(false) -bool(false) -bool(false) ---Iteration 24-- -bool(false) -bool(false) -bool(false) ---Iteration 25-- -bool(false) -bool(false) -bool(false) ---Iteration 26-- -bool(false) -bool(false) -bool(false) ---Iteration 27-- -bool(false) -bool(false) -bool(false) ---Iteration 28-- -bool(false) -bool(false) -bool(false) ---Iteration 29-- -bool(false) -bool(false) -bool(false) ---Iteration 30-- -bool(false) -bool(false) -bool(false) ---Iteration 31-- -bool(false) -bool(false) -bool(false) ---Iteration 32-- -bool(false) -bool(false) -bool(false) ---Iteration 33-- -bool(false) -bool(false) -bool(false) ---Iteration 34-- -bool(false) -bool(false) -bool(false) ---Iteration 35-- -bool(false) -bool(false) -bool(false) ---Iteration 36-- -bool(false) -bool(false) -bool(false) ---Iteration 37-- -bool(false) -bool(false) -bool(false) ---Iteration 38-- -bool(false) -bool(false) -bool(false) ---Iteration 39-- -bool(false) -bool(false) -bool(false) ---Iteration 40-- -bool(false) -bool(false) -bool(false) ---Iteration 41-- -bool(false) -bool(false) -bool(false) ---Iteration 42-- -bool(false) -bool(false) -bool(false) ---Iteration 43-- -bool(false) -bool(false) -bool(false) ---Iteration 44-- -bool(false) -bool(false) -bool(false) ---Iteration 45-- -bool(false) -bool(false) -bool(false) ---Iteration 46-- -bool(false) -bool(false) -bool(false) ---Iteration 47-- -bool(false) -bool(false) -bool(false) ---Iteration 48-- -bool(false) -bool(false) -bool(false) ---Iteration 49-- -bool(false) -bool(false) -bool(false) ---Iteration 50-- -bool(false) -bool(false) -bool(false) ---Iteration 51-- -bool(false) -bool(false) -bool(false) ---Iteration 52-- -bool(false) -bool(false) -bool(false) ---Iteration 53-- -bool(false) -bool(false) -bool(false) ---Iteration 54-- -bool(false) -bool(false) -bool(false) -Done diff --git a/ext/standard/tests/general_functions/is_int_aliases.phpt b/ext/standard/tests/general_functions/is_int_aliases.phpt new file mode 100644 index 000000000000..f9a0b0da0d25 --- /dev/null +++ b/ext/standard/tests/general_functions/is_int_aliases.phpt @@ -0,0 +1,16 @@ +--TEST-- +Test deprecated is_long/is_integer aliases for is_int() + +--FILE-- + +--EXPECTF-- +Deprecated: Function is_long() is deprecated since 8.6, use is_int() instead in %s on line %d +bool(true) + +Deprecated: Function is_integer() is deprecated since 8.6, use is_int() instead in %s on line %d +bool(true) From 4dd8f524ec0ec6a9bc81bbcc8d821680679d3c49 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Wed, 5 Aug 2026 17:35:23 +0100 Subject: [PATCH 7/9] standard: deprecate strcoll and SORT_LOCALE_STRING RFCs: - https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_strcoll - https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_sort_locale_string_flag_for_sort_functions --- ext/standard/basic_functions.stub.php | 2 ++ ext/standard/basic_functions_arginfo.h | 30 ++++++++++++++----- ext/standard/basic_functions_decl.h | 8 ++--- .../tests/array/sort/locale_sort.phpt | 15 +++++----- ext/standard/tests/strings/strcoll.phpt | 3 +- 5 files changed, 38 insertions(+), 20 deletions(-) diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index ae3c9065cb18..fb7c5b90fdb8 100644 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -78,6 +78,7 @@ * @var int * @cvalue PHP_SORT_LOCALE_STRING */ +#[\Deprecated(message: "use one of the Collator::*sort*() methods instead", since: "8.6")] const SORT_LOCALE_STRING = UNKNOWN; /** * @var int @@ -2319,6 +2320,7 @@ function strcspn(string $string, string $characters, int $offset = 0, ?int $leng function nl_langinfo(int $item): string|false {} #endif +#[\Deprecated(message: "use Collator::compare() instead", since: "8.6")] function strcoll(string $string1, string $string2): int {} /** diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h index 91e1cb532768..c352ef20a40a 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: 7a3bb062cb216bd28c1c97c44f2f611992c47063 + * Stub hash: 21b2089bd39aadeeb8730e4bb2fecbb32e65d1c8 * Has decl header: yes */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0) @@ -3158,7 +3158,7 @@ static const zend_function_entry ext_functions[] = { #if defined(HAVE_NL_LANGINFO) ZEND_FE(nl_langinfo, arginfo_nl_langinfo) #endif - ZEND_FE(strcoll, arginfo_strcoll) + ZEND_RAW_FENTRY("strcoll", zif_strcoll, arginfo_strcoll, ZEND_ACC_DEPRECATED, NULL, NULL) ZEND_RAW_FENTRY("trim", zif_trim, arginfo_trim, ZEND_ACC_COMPILE_TIME_EVAL, frameless_function_infos_trim, NULL) ZEND_RAW_FENTRY("rtrim", zif_rtrim, arginfo_rtrim, ZEND_ACC_COMPILE_TIME_EVAL, NULL, NULL) ZEND_RAW_FENTRY("chop", zif_rtrim, arginfo_chop, 0, NULL, NULL) @@ -3550,7 +3550,7 @@ static void register_basic_functions_symbols(int module_number) REGISTER_LONG_CONSTANT("SORT_REGULAR", PHP_SORT_REGULAR, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SORT_NUMERIC", PHP_SORT_NUMERIC, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SORT_STRING", PHP_SORT_STRING, CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("SORT_LOCALE_STRING", PHP_SORT_LOCALE_STRING, CONST_PERSISTENT); + zend_constant *const_SORT_LOCALE_STRING = REGISTER_LONG_CONSTANT("SORT_LOCALE_STRING", PHP_SORT_LOCALE_STRING, CONST_PERSISTENT | CONST_DEPRECATED); REGISTER_LONG_CONSTANT("SORT_NATURAL", PHP_SORT_NATURAL, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SORT_FLAG_CASE", PHP_SORT_FLAG_CASE, CONST_PERSISTENT); REGISTER_LONG_CONSTANT("CASE_LOWER", PHP_CASE_LOWER, CONST_PERSISTENT); @@ -3948,6 +3948,14 @@ static void register_basic_functions_symbols(int module_number) ZVAL_STR(&attribute_Deprecated_func_assert_options_0->args[0].value, ZSTR_KNOWN(ZEND_STR_8_DOT_3)); attribute_Deprecated_func_assert_options_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE); + zend_attribute *attribute_Deprecated_func_strcoll_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "strcoll", sizeof("strcoll") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2); + zend_string *attribute_Deprecated_func_strcoll_0_arg0_str = zend_string_init("use Collator::compare() instead", strlen("use Collator::compare() instead"), 1); + ZVAL_STR(&attribute_Deprecated_func_strcoll_0->args[0].value, attribute_Deprecated_func_strcoll_0_arg0_str); + attribute_Deprecated_func_strcoll_0->args[0].name = ZSTR_KNOWN(ZEND_STR_MESSAGE); + zend_string *attribute_Deprecated_func_strcoll_0_arg1_str = zend_string_init("8.6", strlen("8.6"), 1); + ZVAL_STR(&attribute_Deprecated_func_strcoll_0->args[1].value, attribute_Deprecated_func_strcoll_0_arg1_str); + attribute_Deprecated_func_strcoll_0->args[1].name = ZSTR_KNOWN(ZEND_STR_SINCE); + zend_attribute *attribute_Deprecated_func_utf8_encode_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "utf8_encode", sizeof("utf8_encode") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2); ZVAL_STR(&attribute_Deprecated_func_utf8_encode_0->args[0].value, ZSTR_KNOWN(ZEND_STR_8_DOT_2)); attribute_Deprecated_func_utf8_encode_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE); @@ -3978,30 +3986,36 @@ static void register_basic_functions_symbols(int module_number) zend_string *attribute_Deprecated_func_doubleval_0_arg0_str = zend_string_init("use floatval() instead", strlen("use floatval() instead"), 1); ZVAL_STR(&attribute_Deprecated_func_doubleval_0->args[0].value, attribute_Deprecated_func_doubleval_0_arg0_str); attribute_Deprecated_func_doubleval_0->args[0].name = ZSTR_KNOWN(ZEND_STR_MESSAGE); - zend_string *attribute_Deprecated_func_doubleval_0_arg1_str = zend_string_init("8.6", strlen("8.6"), 1); - ZVAL_STR(&attribute_Deprecated_func_doubleval_0->args[1].value, attribute_Deprecated_func_doubleval_0_arg1_str); + ZVAL_STR_COPY(&attribute_Deprecated_func_doubleval_0->args[1].value, attribute_Deprecated_func_strcoll_0_arg1_str); attribute_Deprecated_func_doubleval_0->args[1].name = ZSTR_KNOWN(ZEND_STR_SINCE); zend_attribute *attribute_Deprecated_func_is_integer_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "is_integer", sizeof("is_integer") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2); zend_string *attribute_Deprecated_func_is_integer_0_arg0_str = zend_string_init("use is_int() instead", strlen("use is_int() instead"), 1); ZVAL_STR(&attribute_Deprecated_func_is_integer_0->args[0].value, attribute_Deprecated_func_is_integer_0_arg0_str); attribute_Deprecated_func_is_integer_0->args[0].name = ZSTR_KNOWN(ZEND_STR_MESSAGE); - ZVAL_STR_COPY(&attribute_Deprecated_func_is_integer_0->args[1].value, attribute_Deprecated_func_doubleval_0_arg1_str); + ZVAL_STR_COPY(&attribute_Deprecated_func_is_integer_0->args[1].value, attribute_Deprecated_func_strcoll_0_arg1_str); attribute_Deprecated_func_is_integer_0->args[1].name = ZSTR_KNOWN(ZEND_STR_SINCE); zend_attribute *attribute_Deprecated_func_is_long_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "is_long", sizeof("is_long") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2); ZVAL_STR_COPY(&attribute_Deprecated_func_is_long_0->args[0].value, attribute_Deprecated_func_is_integer_0_arg0_str); attribute_Deprecated_func_is_long_0->args[0].name = ZSTR_KNOWN(ZEND_STR_MESSAGE); - ZVAL_STR_COPY(&attribute_Deprecated_func_is_long_0->args[1].value, attribute_Deprecated_func_doubleval_0_arg1_str); + ZVAL_STR_COPY(&attribute_Deprecated_func_is_long_0->args[1].value, attribute_Deprecated_func_strcoll_0_arg1_str); attribute_Deprecated_func_is_long_0->args[1].name = ZSTR_KNOWN(ZEND_STR_SINCE); zend_attribute *attribute_Deprecated_func_is_double_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "is_double", sizeof("is_double") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2); zend_string *attribute_Deprecated_func_is_double_0_arg0_str = zend_string_init("use is_float() instead", strlen("use is_float() instead"), 1); ZVAL_STR(&attribute_Deprecated_func_is_double_0->args[0].value, attribute_Deprecated_func_is_double_0_arg0_str); attribute_Deprecated_func_is_double_0->args[0].name = ZSTR_KNOWN(ZEND_STR_MESSAGE); - ZVAL_STR_COPY(&attribute_Deprecated_func_is_double_0->args[1].value, attribute_Deprecated_func_doubleval_0_arg1_str); + ZVAL_STR_COPY(&attribute_Deprecated_func_is_double_0->args[1].value, attribute_Deprecated_func_strcoll_0_arg1_str); attribute_Deprecated_func_is_double_0->args[1].name = ZSTR_KNOWN(ZEND_STR_SINCE); + zend_attribute *attribute_Deprecated_const_SORT_LOCALE_STRING_0 = zend_add_global_constant_attribute(const_SORT_LOCALE_STRING, ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2); + zend_string *attribute_Deprecated_const_SORT_LOCALE_STRING_0_arg0_str = zend_string_init("use one of the Collator::*sort*() methods instead", strlen("use one of the Collator::*sort*() methods instead"), 1); + ZVAL_STR(&attribute_Deprecated_const_SORT_LOCALE_STRING_0->args[0].value, attribute_Deprecated_const_SORT_LOCALE_STRING_0_arg0_str); + attribute_Deprecated_const_SORT_LOCALE_STRING_0->args[0].name = ZSTR_KNOWN(ZEND_STR_MESSAGE); + ZVAL_STR_COPY(&attribute_Deprecated_const_SORT_LOCALE_STRING_0->args[1].value, attribute_Deprecated_func_strcoll_0_arg1_str); + attribute_Deprecated_const_SORT_LOCALE_STRING_0->args[1].name = ZSTR_KNOWN(ZEND_STR_SINCE); + zend_attribute *attribute_Deprecated_const_ASSERT_ACTIVE_0 = zend_add_global_constant_attribute(const_ASSERT_ACTIVE, ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2); ZVAL_STR(&attribute_Deprecated_const_ASSERT_ACTIVE_0->args[0].value, ZSTR_KNOWN(ZEND_STR_8_DOT_3)); attribute_Deprecated_const_ASSERT_ACTIVE_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE); diff --git a/ext/standard/basic_functions_decl.h b/ext/standard/basic_functions_decl.h index ac1e9843da28..159d30b2c002 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: 7a3bb062cb216bd28c1c97c44f2f611992c47063 */ + * Stub hash: 21b2089bd39aadeeb8730e4bb2fecbb32e65d1c8 */ -#ifndef ZEND_BASIC_FUNCTIONS_DECL_7a3bb062cb216bd28c1c97c44f2f611992c47063_H -#define ZEND_BASIC_FUNCTIONS_DECL_7a3bb062cb216bd28c1c97c44f2f611992c47063_H +#ifndef ZEND_BASIC_FUNCTIONS_DECL_21b2089bd39aadeeb8730e4bb2fecbb32e65d1c8_H +#define ZEND_BASIC_FUNCTIONS_DECL_21b2089bd39aadeeb8730e4bb2fecbb32e65d1c8_H typedef enum zend_enum_SortDirection { ZEND_ENUM_SortDirection_Ascending = 1, @@ -20,4 +20,4 @@ typedef enum zend_enum_RoundingMode { ZEND_ENUM_RoundingMode_PositiveInfinity = 8, } zend_enum_RoundingMode; -#endif /* ZEND_BASIC_FUNCTIONS_DECL_7a3bb062cb216bd28c1c97c44f2f611992c47063_H */ +#endif /* ZEND_BASIC_FUNCTIONS_DECL_21b2089bd39aadeeb8730e4bb2fecbb32e65d1c8_H */ diff --git a/ext/standard/tests/array/sort/locale_sort.phpt b/ext/standard/tests/array/sort/locale_sort.phpt index 2caccce78eb4..53d3157b3da0 100644 --- a/ext/standard/tests/array/sort/locale_sort.phpt +++ b/ext/standard/tests/array/sort/locale_sort.phpt @@ -18,10 +18,10 @@ $table = array("AB" => "Alberta", "MB" => "Manitoba", "NB" => "Nouveau-Brunswick", "NL" => "Terre-Neuve-et-Labrador", -"NS" => "Nouvelle-cosse", +"NS" => "Nouvelle-�cosse", "ON" => "Ontario", -"PE" => "le-du-Prince-douard", -"QC" => "Qubec", +"PE" => "�le-du-Prince-�douard", +"QC" => "Qu�bec", "SK" => "Saskatchewan", "NT" => "Territoires du Nord-Ouest", "NU" => "Nunavut", @@ -29,26 +29,27 @@ $table = array("AB" => "Alberta", asort($table, SORT_LOCALE_STRING); var_dump($table); ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Constant SORT_LOCALE_STRING is deprecated since 8.6, use one of the Collator::*sort*() methods instead in %s on line %d array(13) { ["AB"]=> string(7) "Alberta" ["BC"]=> string(20) "Colombie-Britannique" ["PE"]=> - string(21) "le-du-Prince-douard" + string(21) "�le-du-Prince-�douard" ["MB"]=> string(8) "Manitoba" ["NB"]=> string(17) "Nouveau-Brunswick" ["NS"]=> - string(15) "Nouvelle-cosse" + string(15) "Nouvelle-�cosse" ["NU"]=> string(7) "Nunavut" ["ON"]=> string(7) "Ontario" ["QC"]=> - string(6) "Qubec" + string(6) "Qu�bec" ["SK"]=> string(12) "Saskatchewan" ["NL"]=> diff --git a/ext/standard/tests/strings/strcoll.phpt b/ext/standard/tests/strings/strcoll.phpt index d1d3df11fc18..2d36c0e82d89 100644 --- a/ext/standard/tests/strings/strcoll.phpt +++ b/ext/standard/tests/strings/strcoll.phpt @@ -16,5 +16,6 @@ if($result > 0) { echo "Pass\n"; } ?> ---EXPECT-- +--EXPECTF-- +Deprecated: Function strcoll() is deprecated since 8.6, use Collator::compare() instead in %s on line %d Pass From a5a6139a2dd95033622c54042b752ccd8c11a623 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 6 Aug 2026 18:25:19 +0100 Subject: [PATCH 8/9] Zend: move builtin function tests into subfolder --- Zend/tests/{ => builtin_functions}/builtin_functions_basic.phpt | 0 .../{ => builtin_functions}/builtin_in_write_context_error1.phpt | 0 .../{ => builtin_functions}/builtin_in_write_context_error2.phpt | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename Zend/tests/{ => builtin_functions}/builtin_functions_basic.phpt (100%) rename Zend/tests/{ => builtin_functions}/builtin_in_write_context_error1.phpt (100%) rename Zend/tests/{ => builtin_functions}/builtin_in_write_context_error2.phpt (100%) diff --git a/Zend/tests/builtin_functions_basic.phpt b/Zend/tests/builtin_functions/builtin_functions_basic.phpt similarity index 100% rename from Zend/tests/builtin_functions_basic.phpt rename to Zend/tests/builtin_functions/builtin_functions_basic.phpt diff --git a/Zend/tests/builtin_in_write_context_error1.phpt b/Zend/tests/builtin_functions/builtin_in_write_context_error1.phpt similarity index 100% rename from Zend/tests/builtin_in_write_context_error1.phpt rename to Zend/tests/builtin_functions/builtin_in_write_context_error1.phpt diff --git a/Zend/tests/builtin_in_write_context_error2.phpt b/Zend/tests/builtin_functions/builtin_in_write_context_error2.phpt similarity index 100% rename from Zend/tests/builtin_in_write_context_error2.phpt rename to Zend/tests/builtin_functions/builtin_in_write_context_error2.phpt From 95cd7c5db1e7528a9cba4a52365224da35db6af6 Mon Sep 17 00:00:00 2001 From: Gina Peter Banyard Date: Thu, 6 Aug 2026 18:25:54 +0100 Subject: [PATCH 9/9] Zend: deprecate passing a 3rd argument to define() RFC: https://wiki.php.net/rfc/deprecations_php_8_6#deprecate_define_with_case_insensitive_being_specified --- .../tests/builtin_functions/define_arg_3.phpt | 25 +++++++++++++++++++ Zend/zend_builtin_functions.c | 14 ++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/builtin_functions/define_arg_3.phpt diff --git a/Zend/tests/builtin_functions/define_arg_3.phpt b/Zend/tests/builtin_functions/define_arg_3.phpt new file mode 100644 index 000000000000..c7e703264108 --- /dev/null +++ b/Zend/tests/builtin_functions/define_arg_3.phpt @@ -0,0 +1,25 @@ +--TEST-- +define() with 3rd argument +--FILE-- +getMessage(), PHP_EOL; +} + +define('MY_CONSTANT', 5, false); +var_dump(MY_CONSTANT); + +?> +--EXPECT-- +Deprecated: define(): Argument #3 ($case_insensitive) is ignored and treated as false since declaration of case-insensitive constants is no longer supported, passing the argument explicitly is unnecessary in /home/girgias/Dev/php-src/Zend/tests/builtin_functions/define_arg_3.php on line 3 + +Warning: define(): Argument #3 ($case_insensitive) is ignored since declaration of case-insensitive constants is no longer supported, this will be an error in PHP 9.0 in /home/girgias/Dev/php-src/Zend/tests/builtin_functions/define_arg_3.php on line 3 +Error: Undefined constant "MY_CONSTANT" + +Deprecated: define(): Argument #3 ($case_insensitive) is ignored and treated as false since declaration of case-insensitive constants is no longer supported, passing the argument explicitly is unnecessary in /home/girgias/Dev/php-src/Zend/tests/builtin_functions/define_arg_3.php on line 11 +int(5) diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index ed0507e0500e..860413f84111 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -568,13 +568,25 @@ ZEND_FUNCTION(define) Z_PARAM_BOOL(non_cs) ZEND_PARSE_PARAMETERS_END(); + if (ZEND_NUM_ARGS() == 3) { + zend_error(E_DEPRECATED, + "define(): Argument #3 ($case_insensitive) is ignored and treated as false since declaration of case-insensitive constants is no longer supported, passing the argument explicitly is unnecessary" + ); + if (UNEXPECTED(EG(exception))) { + RETURN_THROWS(); + } + } + if (zend_memnstr(ZSTR_VAL(name), "::", sizeof("::") - 1, ZSTR_VAL(name) + ZSTR_LEN(name))) { zend_argument_value_error(1, "cannot be a class constant"); RETURN_THROWS(); } if (non_cs) { - zend_error(E_WARNING, "define(): Argument #3 ($case_insensitive) is ignored since declaration of case-insensitive constants is no longer supported"); + zend_error(E_WARNING, "define(): Argument #3 ($case_insensitive) is ignored since declaration of case-insensitive constants is no longer supported, this will be an error in PHP 9.0"); + if (UNEXPECTED(EG(exception))) { + RETURN_THROWS(); + } } if (Z_TYPE_P(val) == IS_ARRAY && Z_REFCOUNTED_P(val)) {