From c10586c4abd4f899ec993dede80dca406a6aa6aa Mon Sep 17 00:00:00 2001 From: Jordi Kroon Date: Thu, 2 Apr 2026 20:29:05 +0200 Subject: [PATCH 1/6] add DelayedTargetValidation attribute documentation --- language/predefined/attributes.xml | 5 +- .../attributes/delayedtargetvalidation.xml | 132 ++++++++++++++++++ language/predefined/versions.xml | 1 + 3 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 language/predefined/attributes/delayedtargetvalidation.xml diff --git a/language/predefined/attributes.xml b/language/predefined/attributes.xml index 3e97de7913c9..c8da10e32d2e 100644 --- a/language/predefined/attributes.xml +++ b/language/predefined/attributes.xml @@ -3,13 +3,14 @@ Predefined Attributes - + PHP provides some predefined attributes that can be used. - + &language.predefined.attributes.attribute; &language.predefined.attributes.allowdynamicproperties; + &language.predefined.attributes.delayedtargetvalidation; &language.predefined.attributes.deprecated; &language.predefined.attributes.nodiscard; &language.predefined.attributes.override; diff --git a/language/predefined/attributes/delayedtargetvalidation.xml b/language/predefined/attributes/delayedtargetvalidation.xml new file mode 100644 index 000000000000..4fa100a75f43 --- /dev/null +++ b/language/predefined/attributes/delayedtargetvalidation.xml @@ -0,0 +1,132 @@ + + + The DelayedTargetValidation attribute + DelayedTargetValidation + + + +
+ &reftitle.intro; + + This attribute delays target validation errors for internal attributes + from compile time to runtime. + + + When applied to a declaration, any invalid usage of internal attributes + on the same target will not trigger a compile time error. Instead, the + validation is deferred and performed when the attribute is accessed via + the Reflection API. + + + This is primarily intended for forward compatibility, allowing code to + use attributes that may gain additional valid targets in future PHP + versions without breaking on older versions. + +
+ +
+ &reftitle.classsynopsis; + + + + #[\Attribute] + final + DelayedTargetValidation + + + +
+ +
+ &reftitle.examples; + + + Delaying validation of an invalid target + + + + On PHP versions where Override is not allowed on + class constants, this does not produce a compile time error. + + + + + Validation occurs during reflection + getAttributes() as $attribute) { + $attribute->newInstance(); // May throw if invalid +} +]]> + + + When the attribute is instantiated via reflection, target validation is + performed and an error may be thrown if the attribute is used on an + unsupported target. + + + +
+ +
+ &reftitle.notes; + + This attribute only affects target validation of internal attributes. + + + It does not suppress functional validation performed by those attributes. + For example, Override will still emit an error if a + method does not actually override a parent method. + +
+ +
+ &reftitle.seealso; + + Attributes overview + Override + +
+ +
+ +
+ diff --git a/language/predefined/versions.xml b/language/predefined/versions.xml index 3a821aaa8e37..0386fef4b1a2 100644 --- a/language/predefined/versions.xml +++ b/language/predefined/versions.xml @@ -181,6 +181,7 @@ + From b6112892dc91b217cfff94194710fc0287548e0f Mon Sep 17 00:00:00 2001 From: Jordi Kroon Date: Thu, 2 Apr 2026 21:58:15 +0200 Subject: [PATCH 2/6] clarify reflection example --- language/predefined/attributes/delayedtargetvalidation.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/language/predefined/attributes/delayedtargetvalidation.xml b/language/predefined/attributes/delayedtargetvalidation.xml index 4fa100a75f43..fcad07213809 100644 --- a/language/predefined/attributes/delayedtargetvalidation.xml +++ b/language/predefined/attributes/delayedtargetvalidation.xml @@ -79,9 +79,10 @@ foreach ($reflection->getAttributes() as $attribute) { ]]> - When the attribute is instantiated via reflection, target validation is - performed and an error may be thrown if the attribute is used on an - unsupported target. + When the attribute is instantiated via reflection using + ReflectionAttribute::newInstance(), + target validation is performed and an exception may be thrown if the attribute + is used on an unsupported target. From 90c85dc8cf55ff078ecff8e0e2b2859de30a94a0 Mon Sep 17 00:00:00 2001 From: Jordi Kroon Date: Mon, 6 Apr 2026 19:39:43 +0200 Subject: [PATCH 3/6] apply suggestions for DelayedTargetValidation Co-authored-by: Louis-Arnaud --- language/predefined/attributes/delayedtargetvalidation.xml | 4 ++-- language/predefined/versions.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/language/predefined/attributes/delayedtargetvalidation.xml b/language/predefined/attributes/delayedtargetvalidation.xml index fcad07213809..13e3099900b7 100644 --- a/language/predefined/attributes/delayedtargetvalidation.xml +++ b/language/predefined/attributes/delayedtargetvalidation.xml @@ -9,7 +9,7 @@ &reftitle.intro; This attribute delays target validation errors for internal attributes - from compile time to runtime. + from compile time to when the attribute is instantiated via the Reflection API. When applied to a declaration, any invalid usage of internal attributes @@ -37,7 +37,7 @@ -
+
&reftitle.examples; diff --git a/language/predefined/versions.xml b/language/predefined/versions.xml index 0386fef4b1a2..93435c7a55ba 100644 --- a/language/predefined/versions.xml +++ b/language/predefined/versions.xml @@ -181,9 +181,9 @@ - + From 7b774cbf20ab6b6e902439bbecd70a83151f2e8b Mon Sep 17 00:00:00 2001 From: Jordi Kroon Date: Sat, 25 Apr 2026 21:07:50 +0200 Subject: [PATCH 4/6] clarify DelayedTargetValidation target validation behavior --- language/predefined/attributes/delayedtargetvalidation.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/language/predefined/attributes/delayedtargetvalidation.xml b/language/predefined/attributes/delayedtargetvalidation.xml index 13e3099900b7..1a067db2070b 100644 --- a/language/predefined/attributes/delayedtargetvalidation.xml +++ b/language/predefined/attributes/delayedtargetvalidation.xml @@ -79,7 +79,8 @@ foreach ($reflection->getAttributes() as $attribute) { ]]> - When the attribute is instantiated via reflection using + When any attribute applied to the same target (other than + DelayedTargetValidation itself) is instantiated via reflection using ReflectionAttribute::newInstance(), target validation is performed and an exception may be thrown if the attribute is used on an unsupported target. From c63b2c47d168f32b4cfacc12e4ac573337512b4c Mon Sep 17 00:00:00 2001 From: Jordi Kroon Date: Sat, 25 Apr 2026 21:08:38 +0200 Subject: [PATCH 5/6] apply suggestions Co-authored-by: Louis-Arnaud --- language/predefined/attributes/delayedtargetvalidation.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/language/predefined/attributes/delayedtargetvalidation.xml b/language/predefined/attributes/delayedtargetvalidation.xml index 1a067db2070b..4ca255f144ba 100644 --- a/language/predefined/attributes/delayedtargetvalidation.xml +++ b/language/predefined/attributes/delayedtargetvalidation.xml @@ -14,8 +14,8 @@ When applied to a declaration, any invalid usage of internal attributes on the same target will not trigger a compile time error. Instead, the - validation is deferred and performed when the attribute is accessed via - the Reflection API. + validation is deferred and performed when the attribute is instantiated + via ReflectionAttribute::newInstance(). This is primarily intended for forward compatibility, allowing code to From 6a776e58135366fc9aff59a930143903e16c5e42 Mon Sep 17 00:00:00 2001 From: Jordi Kroon Date: Sat, 25 Apr 2026 21:10:03 +0200 Subject: [PATCH 6/6] remove whitespace --- language/predefined/attributes/delayedtargetvalidation.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/language/predefined/attributes/delayedtargetvalidation.xml b/language/predefined/attributes/delayedtargetvalidation.xml index 4ca255f144ba..8f291b2cb258 100644 --- a/language/predefined/attributes/delayedtargetvalidation.xml +++ b/language/predefined/attributes/delayedtargetvalidation.xml @@ -79,7 +79,7 @@ foreach ($reflection->getAttributes() as $attribute) { ]]> - When any attribute applied to the same target (other than + When any attribute applied to the same target (other than DelayedTargetValidation itself) is instantiated via reflection using ReflectionAttribute::newInstance(), target validation is performed and an exception may be thrown if the attribute