[doc-en] master: Dynamic Properties - Clarify scope of deprecation (#2181)

From: Date: Mon, 28 Sep 2026 08:20:19 +0000
Subject: [doc-en] master: Dynamic Properties - Clarify scope of deprecation (#2181)
Groups: php.doc.cvs 
Request: Send a blank email to doc-cvs+get-23787@lists.php.net to get a copy of this message
Author: Tim Otten (totten)
Committer: GitHub (web-flow)
Pusher: lacatoire
Date: 2026-09-28T10:20:16+02:00

Commit: https://github.com/php/doc-en/commit/822b0828562580aac0327eb2d84e8e6e06e51a98
Raw diff: https://github.com/php/doc-en/commit/822b0828562580aac0327eb2d84e8e6e06e51a98.diff

Dynamic Properties - Clarify scope of deprecation (#2181)

* Dynamic Properties - Clarify scope of deprecation

The phrasing in the manual is confusing/misleading -- it suggests that all
forms of dynamism are deprecated.  But let's go to the RFC that introduced
the current policy:

https://wiki.php.net/rfc/deprecate_dynamic_properties

"This RFC proposes to deprecate and later remove the creation of dynamic
properties, unless the class explicitly allows dynamic properties."

The sentence structure is awkward but clear -- it allows for *explicitly*
enabled dynamic-properties.  This interpretation aligns with the actual
behavior that was implemented.  Compare:

1. At the time of the RFC's writing, there was implicit/universal support
   for dynamic-properties. PHP 8.2 respects the mechanism but generates
   a deprecation warning.
2. As a replacement, the RFC added a new explicit/opt-in mechanism for
   dynamic-properties (AllowDynamicProperties). PHP 8.2 was the first
   version to have this. It does not produce any deprecation warnings.

* Update allowdynamicproperties.xml and properties.xml

Co-authored-by: Kamil Tekiela <tekiela246@gmail.com>

* properties.xml - Split the affirmative and cautionary notes

There is a sense in which "dynamic properties" are supported - as long as
you use them in the defined way (eg stdClass, AllowDynamicProperties).

There is another sense in which "dynamic properties" are not supported -
when you use them in an old/bad way.

After re-reading, it seemed weird that the affirmative parts were listed
inside the cautionary parts.  Seems easier to read as separate statements.

* allowdynamicproperties.xml - Remove crystal ball

* Use simpara for inline-only paragraphs (Style Check)

* Add missing <title> to formal <example> blocks

DocBook example requires a title; jing rejected the build with
'simpara not allowed yet; expected info, title or titleabbrev'.

* Address kamil-tekiela's review nits

Fix oxymoronic example title, drop redundant parenthetical, and use
consistent 'dynamic property' terminology.

---------

Co-authored-by: Kamil Tekiela <tekiela246@gmail.com>
Co-authored-by: Louis-Arnaud <la.catoire@gmail.com>

Changed paths:
  M  language/oop5/properties.xml
  M  language/predefined/attributes/allowdynamicproperties.xml


Diff:

diff --git a/language/oop5/properties.xml b/language/oop5/properties.xml
index a3e7f23a00ae..d7e11e6b0f7f 100644
--- a/language/oop5/properties.xml
+++ b/language/oop5/properties.xml
@@ -408,16 +408,20 @@ var_dump($test2->prop); // NULL
     This dynamically created property will <emphasis>only</emphasis> be
     available on this class instance.
    </para>
-
+   <simpara>
+    Dynamic properties are supported by <link
linkend="stdclass.intro">stdClass</link> and its subclasses. Other classes may
enable similar behavior with <link
linkend="allowdynamicproperties.intro">AllowDynamicProperties</link> or <link
linkend="language.oop5.overloading">property overloading</link>.
+   </simpara>
    <warning>
     <simpara>
-     Dynamic properties are deprecated as of PHP 8.2.0.
+     Creating a dynamic property is deprecated as of PHP 8.2.0,
+     unless the class is marked with the
+     <code>#[\AllowDynamicProperties]</code> attribute.
      It is recommended to declare the property instead.
      To handle arbitrary property names, the class should implement the magic
      methods <link linkend="object.get">__get()</link> and
      <link linkend="object.set">__set()</link>.
-     As a last resort the class can be marked with the
-     <code>#[\AllowDynamicProperties]</code> attribute.
+     Marking the class with the attribute remains an option, but is
+     generally considered a last resort.
     </simpara>
    </warning>
   </sect2>
diff --git a/language/predefined/attributes/allowdynamicproperties.xml
b/language/predefined/attributes/allowdynamicproperties.xml
index f3410a5e7ea6..bca19cc3b849 100644
--- a/language/predefined/attributes/allowdynamicproperties.xml
+++ b/language/predefined/attributes/allowdynamicproperties.xml
@@ -20,6 +20,15 @@
      attribute.
     </simpara>
    </note>
+   <note>
+    <simpara>
+     This attribute was introduced in PHP 8.2.0 as the explicit way to allow
+     dynamic properties. Creating a dynamic property on a class that does
+     not use this attribute, and that does not implement
+     <link linkend="object.get">__get()</link> or
+     <link linkend="object.set">__set()</link>, is deprecated.
+    </simpara>
+   </note>
   </section>
 
   <section xml:id="allowdynamicproperties.synopsis">
@@ -40,33 +49,46 @@
 
   <section>
    &reftitle.examples;
-   <simpara>
-    Dynamic properties are deprecated as of PHP 8.2.0,
-    thus using them without marking the class with this attribute will emit
-    a deprecation notice.
-   </simpara>
    <example>
-    <title>AllowDynamicProperties with non-existing property</title>
+    <title>AllowDynamicProperties with a dynamic property</title>
+    <simpara>
+     To enable dynamic properties, add <literal>#[\AllowDynamicProperties]</literal>.
+    </simpara>
     <programlisting role="php">
 <![CDATA[
 <?php
-class DefaultBehaviour { }
-
 #[\AllowDynamicProperties]
-class ClassAllowsDynamicProperties { }
+class ValidExample { }
 
-$o1 = new DefaultBehaviour();
-$o2 = new ClassAllowsDynamicProperties();
+$obj = new ValidExample();
+$obj->myDynamicProp = 1234;
+?>
+]]>
+    </programlisting>
+   </example>
 
-$o1->nonExistingProp = true;
-$o2->nonExistingProp = true;
+   <example>
+    <title>AllowDynamicProperties with non-existing property</title>
+    <simpara>
+     As of PHP 8.2.0, the declaration is required unless the class uses
+     this attribute. Creating an undeclared property
+     on such a class emits a deprecation notice.
+    </simpara>
+
+    <programlisting role="php">
+<![CDATA[
+<?php
+class InvalidExample { }
+
+$obj = new InvalidExample();
+$obj->myUnknownProperty = 1234;
 ?>
 ]]>
     </programlisting>
     &example.outputs.82;
     <screen>
 <![CDATA[
-Deprecated: Creation of dynamic property DefaultBehaviour::$nonExistingProp is deprecated in file
on line 10
+Deprecated: Creation of dynamic property InvalidExample::$myUnknownProperty is deprecated in file
on line 5
 ]]>
     </screen>
    </example>


Thread (1 message)

  • Tim Otten via GitHub
« previous php.doc.cvs (#23787) next »