From 66489f62a9ab9086adc9cc5c5810f0e49892d852 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 | 3 + UPGRADING | 1 + .../deprecate_namespace_class_constant.phpt | 67 +++++++++++++++++++ Zend/tests/grammar/semi_reserved_005.phpt | 2 + Zend/zend_API.c | 3 + 5 files changed, 76 insertions(+) create mode 100644 Zend/tests/deprecate_namespace_class_constant.phpt diff --git a/NEWS b/NEWS index 4364d69650e5..8b2408764c50 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,9 @@ PHP NEWS ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? ????, PHP 8.6.0beta1 +- Core: + . Deprecated "namespace" as a class constant name. (NickSdot) + - GMP: . Added optional $definitely_prime output parameter to gmp_prevprime(). (Weilin Du) diff --git a/UPGRADING b/UPGRADING index fd66c7e61180..f7041e142876 100644 --- a/UPGRADING +++ b/UPGRADING @@ -396,6 +396,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 a8b8b131175cf4b8abbf10e42711cb56c32f420f 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