1
0
mirror of https://github.com/php/php-src.git synced 2026-04-26 09:28:21 +02:00
Files
archived-php-src/ext/intl/tests/formatter_fail.phpt
T
Nikita Popov b10416a652 Deprecate passing null to non-nullable arg of internal function
This deprecates passing null to non-nullable scale arguments of
internal functions, with the eventual goal of making the behavior
consistent with userland functions, where null is never accepted
for non-nullable arguments.

This change is expected to cause quite a lot of fallout. In most
cases, calling code should be adjusted to avoid passing null. In
some cases, PHP should be adjusted to make some function arguments
nullable. I have already fixed a number of functions before landing
this, but feel free to file a bug if you encounter a function that
doesn't accept null, but probably should. (The rule of thumb for
this to be applicable is that the function must have special behavior
for 0 or "", which is distinct from the natural behavior of the
parameter.)

RFC: https://wiki.php.net/rfc/deprecate_null_to_scalar_internal_arg

Closes GH-6475.
2021-02-11 21:46:13 +01:00

145 lines
4.3 KiB
PHP

--TEST--
numfmt creation failures
--SKIPIF--
<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
--FILE--
<?php
function err($fmt) {
if(!$fmt) {
echo var_export(intl_get_error_message(), true)."\n";
}
}
function print_exception($e) {
echo "\n" . get_class($e) . ": " . $e->getMessage()
. " in " . $e->getFile() . " on line " . $e->getLine() . "\n";
}
function crt($t, $l, $s) {
switch(true) {
case $t == "O":
try {
return new NumberFormatter($l, $s);
} catch (Throwable $e) {
print_exception($e);
return null;
}
break;
case $t == "C":
try {
return NumberFormatter::create($l, $s);
} catch (Throwable $e) {
print_exception($e);
return null;
}
break;
case $t == "P":
try {
return numfmt_create($l, $s);
} catch (Throwable $e) {
print_exception($e);
return null;
}
break;
}
}
$args = array(
array(null, null),
array("whatever", 1234567),
array(array(), array()),
array("en", -1),
array("en_US", NumberFormatter::PATTERN_RULEBASED),
);
try {
$fmt = new NumberFormatter();
} catch (TypeError $e) {
print_exception($e);
$fmt = null;
}
err($fmt);
try {
$fmt = numfmt_create();
} catch (TypeError $e) {
print_exception($e);
$fmt = null;
}
err($fmt);
try {
$fmt = NumberFormatter::create();
} catch (TypeError $e) {
print_exception($e);
$fmt = null;
}
err($fmt);
$fmt = new NumberFormatter('en_US', NumberFormatter::DECIMAL);
try {
$fmt->__construct('en_US', NumberFormatter::DECIMAL);
} catch (Error $e) {
print_exception($e);
$fmt = null;
}
err($fmt);
foreach($args as $arg) {
$fmt = crt("O", $arg[0], $arg[1]);
err($fmt);
$fmt = crt("C", $arg[0], $arg[1]);
err($fmt);
$fmt = crt("P", $arg[0], $arg[1]);
err($fmt);
}
?>
--EXPECTF--
ArgumentCountError: NumberFormatter::__construct() expects at least 2 arguments, 0 given in %s on line %d
'U_ZERO_ERROR'
ArgumentCountError: numfmt_create() expects at least 2 arguments, 0 given in %s on line %d
'U_ZERO_ERROR'
ArgumentCountError: NumberFormatter::create() expects at least 2 arguments, 0 given in %s on line %d
'U_ZERO_ERROR'
Error: NumberFormatter object is already constructed in %s on line %d
'U_ZERO_ERROR'
Deprecated: NumberFormatter::__construct(): Passing null to parameter #1 ($locale) of type string is deprecated in %s on line %d
Deprecated: NumberFormatter::__construct(): Passing null to parameter #2 ($style) of type int is deprecated in %s on line %d
Deprecated: NumberFormatter::create(): Passing null to parameter #1 ($locale) of type string is deprecated in %s on line %d
Deprecated: NumberFormatter::create(): Passing null to parameter #2 ($style) of type int is deprecated in %s on line %d
Deprecated: numfmt_create(): Passing null to parameter #1 ($locale) of type string is deprecated in %s on line %d
Deprecated: numfmt_create(): Passing null to parameter #2 ($style) of type int is deprecated in %s on line %d
IntlException: Constructor failed in %s on line %d
'numfmt_create: number formatter creation failed: U_UNSUPPORTED_ERROR'
'numfmt_create: number formatter creation failed: U_UNSUPPORTED_ERROR'
'numfmt_create: number formatter creation failed: U_UNSUPPORTED_ERROR'
TypeError: NumberFormatter::__construct(): Argument #1 ($locale) must be of type string, array given in %s on line %d
'U_ZERO_ERROR'
TypeError: NumberFormatter::create(): Argument #1 ($locale) must be of type string, array given in %s on line %d
'U_ZERO_ERROR'
TypeError: numfmt_create(): Argument #1 ($locale) must be of type string, array given in %s on line %d
'U_ZERO_ERROR'
IntlException: Constructor failed in %s on line %d
'numfmt_create: number formatter creation failed: U_UNSUPPORTED_ERROR'
'numfmt_create: number formatter creation failed: U_UNSUPPORTED_ERROR'
'numfmt_create: number formatter creation failed: U_UNSUPPORTED_ERROR'
IntlException: Constructor failed in %s on line %d
'numfmt_create: number formatter creation failed: U_MEMORY_ALLOCATION_ERROR'
'numfmt_create: number formatter creation failed: U_MEMORY_ALLOCATION_ERROR'
'numfmt_create: number formatter creation failed: U_MEMORY_ALLOCATION_ERROR'