From fbd30175115a206e95f70c3ddbac16ec6f3b302e Mon Sep 17 00:00:00 2001 From: Daniel Scherzer Date: Wed, 15 Apr 2026 08:49:37 -0700 Subject: [PATCH 1/2] GH-21754: sapi/cli: avoid deprecation messages with `--rf` and methods (#21758) --- NEWS | 4 ++++ sapi/cli/php_cli.c | 18 +++++++++++++++--- sapi/cli/tests/004.phpt | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 8c423fe61cec..f3b3e3a6aa38 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,10 @@ PHP NEWS self::/parent::/static:: callables if the error handler throws). (macoaure) . Fixed bug GH-21603 (Missing addref for __unset). (ilutov) +- CLI: + . Fixed bug GH-21754 (`--rf` command line option with a method triggers + ext/reflection deprecation warnings). (DanielEScherzer) + - Curl: . Add support for brotli and zstd on Windows. (Shivam Mathur) diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c index 9444f3d6253a..4b19cf0604c6 100644 --- a/sapi/cli/php_cli.c +++ b/sapi/cli/php_cli.c @@ -1042,13 +1042,25 @@ static int do_cli(int argc, char **argv) /* {{{ */ } ZVAL_STRING(&arg, reflection_what); - object_init_ex(&ref, pce); memset(&execute_data, 0, sizeof(zend_execute_data)); execute_data.func = (zend_function *) &zend_pass_function; EG(current_execute_data) = &execute_data; - zend_call_known_instance_method_with_1_params( - pce->constructor, Z_OBJ(ref), NULL, &arg); + // Avoid deprecation warnings from ReflectionMethod::__construct() + // with one argument + if (pce == reflection_method_ptr) { + zend_function *create_from_method = zend_hash_str_find_ptr( + &(pce->function_table), + "createfrommethodname", + strlen( "createFromMethodName" ) + ); + zend_call_known_function( + create_from_method, NULL, pce, &ref, 1, &arg, NULL); + } else { + object_init_ex(&ref, pce); + zend_call_known_instance_method_with_1_params( + pce->constructor, Z_OBJ(ref), NULL, &arg); + } if (EG(exception)) { zval rv; diff --git a/sapi/cli/tests/004.phpt b/sapi/cli/tests/004.phpt index 83da934c8ff1..69dc46b5b902 100644 --- a/sapi/cli/tests/004.phpt +++ b/sapi/cli/tests/004.phpt @@ -12,6 +12,9 @@ $php = getenv('TEST_PHP_EXECUTABLE_ESCAPED'); var_dump(`$php -n --rf unknown`); var_dump(`$php -n --rf echo`); var_dump(`$php -n --rf phpinfo`); +// Regression tests for https://github.com/php/php-src/issues/21754 +var_dump(`$php -n --rf ReflectionMethod::__construct`); +var_dump(`$php -n --rf ReflectionMethod::missing`); echo "Done\n"; ?> @@ -28,5 +31,16 @@ string(155) "Function [ function phpinfo ] { - Return [ true ] } +" +string(213) "Method [ public method __construct ] { + + - Parameters [2] { + Parameter #0 [ object|string $objectOrMethod ] + Parameter #1 [ ?string $method = null ] + } +} + +" +string(61) "Exception: Method ReflectionMethod::missing() does not exist " Done From f437b8b0e9f6177608968a38c00bcfd74032b9bc Mon Sep 17 00:00:00 2001 From: Jorg Adam Sowa Date: Wed, 15 Apr 2026 18:42:11 +0200 Subject: [PATCH 2/2] docs: add error message wording conventions to CODING_STANDARDS (#21761) --- CODING_STANDARDS.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CODING_STANDARDS.md b/CODING_STANDARDS.md index 47b76717c839..3a53d0e258ca 100644 --- a/CODING_STANDARDS.md +++ b/CODING_STANDARDS.md @@ -79,6 +79,16 @@ rewritten to comply with these rules. return value for functions that perform some operation that may succeed or fail. +1. When throwing a `ValueError` or emitting a warning, use consistent + phrasing for error messages. Common patterns are: + + * Type errors: `must be of type int` (use the type name, not e.g. `must be an integer`) + * Range/boundary: `must be between X and Y` / `must be greater than [or equal to] X` / `must be less than X` / `must be finite` + * String constraints: `must not contain any null bytes` / `must not be empty` / `must be a single character` + * Valid value: `must be a valid X` (e.g. `must be a valid encoding`, `must be a valid calendar ID`) + * Enum-like: `must be one of X, Y, or Z` + * Structural: `must have X` / `must have key X` / `must have N elements` + ## User functions/methods naming conventions 1. Function names for user-level functions should be enclosed with in the