From c10586c4abd4f899ec993dede80dca406a6aa6aa Mon Sep 17 00:00:00 2001 From: Jordi Kroon Date: Thu, 2 Apr 2026 20:29:05 +0200 Subject: [PATCH 1/3] 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/3] 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/3] 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 @@ - +