From b3283ca47a2885679ad269ff907be4a7508dede5 Mon Sep 17 00:00:00 2001 From: NickSdot Date: Fri, 31 Jul 2026 16:19:43 +0700 Subject: [PATCH 1/2] refactor: deprecate using `namespace` as class constant name --- NEWS | 1 + UPGRADING | 1 + .../deprecate_namespace_class_constant.phpt | 67 +++++++++++++++++++ Zend/tests/grammar/semi_reserved_005.phpt | 2 + Zend/zend_API.c | 3 + 5 files changed, 74 insertions(+) create mode 100644 Zend/tests/deprecate_namespace_class_constant.phpt diff --git a/NEWS b/NEWS index b99bdc51e87c..40a56ed20fba 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,7 @@ PHP NEWS ?? ??? ????, PHP 8.6.0beta1 - Core: + . Deprecated "namespace" as a class constant name. (NickSdot) . Changed run-tests.php to run test subprocesses without a shell where possible. (NickSdot) . Fixed GH-23083 (SEGV build_trace_args in zend_exceptions.c with diff --git a/UPGRADING b/UPGRADING index ba4bf182911f..49c7a3f576cf 100644 --- a/UPGRADING +++ b/UPGRADING @@ -433,6 +433,7 @@ PHP 8.6 UPGRADE NOTES ======================================== - Core: + . Using "namespace" as a class constant name is deprecated. . Specifying a return type of array|null / ?array for __debugInfo() is now deprecated. Specify array instead. . Returning values from __construct() and __destruct() is now deprecated. diff --git a/Zend/tests/deprecate_namespace_class_constant.phpt b/Zend/tests/deprecate_namespace_class_constant.phpt new file mode 100644 index 000000000000..c44ebbc258da --- /dev/null +++ b/Zend/tests/deprecate_namespace_class_constant.phpt @@ -0,0 +1,67 @@ +--TEST-- +Using "namespace" as a class constant name is deprecated +--FILE-- +value, PHP_EOL; +echo Sup::namespace, PHP_EOL; +echo Can::$namespace, PHP_EOL; +echo Can::namespace(), PHP_EOL; +echo constant('namespace'), PHP_EOL; + +?> +--EXPECTF-- +Deprecated: Declaring class constant called 'namespace' is deprecated in %s on line %d + +Deprecated: Declaring interface constant called 'namespace' is deprecated in %s on line %d + +Deprecated: Declaring enum constant called 'namespace' is deprecated in %s on line %d + +Deprecated: Declaring trait constant called 'namespace' is deprecated in %s on line %d + +Deprecated: Declaring enum constant called 'namespace' is deprecated in %s on line %d +class constant value +interface constant value +enum constant value +enum case value +trait constant value +property value +method value +global constant value diff --git a/Zend/tests/grammar/semi_reserved_005.phpt b/Zend/tests/grammar/semi_reserved_005.phpt index 4a9a19e11812..a76243e6bcd3 100644 --- a/Zend/tests/grammar/semi_reserved_005.phpt +++ b/Zend/tests/grammar/semi_reserved_005.phpt @@ -1,5 +1,7 @@ --TEST-- Test semi-reserved words as class constants +--INI-- +error_reporting=E_ALL&~E_DEPRECATED --FILE-- type == ZEND_INTERNAL_CLASS ? E_CORE_ERROR : E_COMPILE_ERROR, "A class constant must not be called 'class'; it is reserved for class name fetching"); + } else if (zend_string_equals_literal_ci(name, "namespace")) { + zend_error(E_DEPRECATED, "Declaring %s constant called 'namespace' is deprecated", + zend_get_object_type(ce)); } if (Z_TYPE_P(value) == IS_STRING && !ZSTR_IS_INTERNED(Z_STR_P(value))) { From a4f6b0d9521597d230b0829ceae4321866eba0f9 Mon Sep 17 00:00:00 2001 From: NickSdot Date: Sun, 2 Aug 2026 02:12:35 +0700 Subject: [PATCH 2/2] review: added assert for deprecation --- Zend/tests/grammar/semi_reserved_005.phpt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Zend/tests/grammar/semi_reserved_005.phpt b/Zend/tests/grammar/semi_reserved_005.phpt index a76243e6bcd3..06c428eacbc3 100644 --- a/Zend/tests/grammar/semi_reserved_005.phpt +++ b/Zend/tests/grammar/semi_reserved_005.phpt @@ -1,7 +1,5 @@ --TEST-- Test semi-reserved words as class constants ---INI-- -error_reporting=E_ALL&~E_DEPRECATED --FILE-- ---EXPECT-- +--EXPECTF-- +Deprecated: Declaring class constant called 'namespace' is deprecated in %s on line %d empty callable trait