Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions language/oop5/properties.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 4e77868e15fea65175b87a38d6d31b61d63f7f8e Maintainer: lacatoire Status: ready -->
<!-- EN-Revision: 822b0828562580aac0327eb2d84e8e6e06e51a98 Maintainer: lacatoire Status: ready -->
<sect1 xml:id="language.oop5.properties" xmlns="http://docbook.org/ns/docbook">
<title>Propriétés</title>

Expand Down Expand Up @@ -420,23 +420,31 @@ var_dump($test2->prop); // NULL
</sect2>

<sect2 xml:id="language.oop5.properties.dynamic-properties">
<title>Propriétés Dynamiques</title>
<title>Propriétés dynamiques</title>
<para>
Lors d'une tentative d'assignation à une propriété non existante sur un
&object;, PHP créera automatiquement une propriété correspondante.
Cette propriété créée dynamiquement sera <emphasis>uniquement</emphasis>
disponible sur cette instance de classe.
</para>

<simpara>
Les propriétés dynamiques sont supportées par
<link linkend="stdclass.intro">stdClass</link> et ses classes filles.
Les autres classes peuvent activer un comportement similaire avec
<link linkend="allowdynamicproperties.intro">AllowDynamicProperties</link>
ou la <link linkend="language.oop5.overloading">surcharge de propriétés</link>.
</simpara>
<warning>
<simpara>
Les propriétés dynamiques sont obsolètes à partir de PHP 8.2.0.
La création d'une propriété dynamique est obsolète à partir de PHP 8.2.0,
sauf si la classe est marquée avec l'attribut
<code>#[\AllowDynamicProperties]</code>.
Il est recommandé de déclarer la propriété à la place.
Pour gérer des noms de propriétés arbitraires, la classe devrait implémenter
les méthodes magiques <link linkend="object.get">__get()</link> et
<link linkend="object.set">__set()</link>.
En dernier recours, la classe peut être marquée avec l'attribut
<code>#[\AllowDynamicProperties]</code>.
Marquer la classe avec l'attribut reste une option, mais est
généralement considéré comme un dernier recours.
</simpara>
</warning>
</sect2>
Expand Down
53 changes: 38 additions & 15 deletions language/predefined/attributes/allowdynamicproperties.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 8dc5bef8981ffd33c8c51f7f33414fcf5c03767a Maintainer: pierrick Status: ready -->
<!-- EN-Revision: 822b0828562580aac0327eb2d84e8e6e06e51a98 Maintainer: pierrick Status: ready -->
<reference xml:id="class.allowdynamicproperties" role="class" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>La classe AllowDynamicProperties</title>
<titleabbrev>AllowDynamicProperties</titleabbrev>
Expand All @@ -20,6 +20,15 @@
les propriétés dynamiques, même si elles ne déclarent pas explicitement l'attribut.
</simpara>
</note>
<note>
<simpara>
Cet attribut a été introduit en PHP 8.2.0 comme moyen explicite
d'autoriser les propriétés dynamiques. La création d'une propriété
dynamique sur une classe qui n'utilise pas cet attribut, et qui
n'implémente ni <link linkend="object.get">__get()</link> ni
<link linkend="object.set">__set()</link>, est obsolète.
</simpara>
</note>
</section>

<section xml:id="allowdynamicproperties.synopsis">
Expand All @@ -40,33 +49,47 @@

<section>
&reftitle.examples;
<simpara>
Les propriétés dynamiques sont obsolètes à partir de PHP 8.2.0,
donc les utiliser sans marquer la classe avec cet attribut émettra
un avis d'obsolescence.
</simpara>
<example>
<title>AllowDynamicProperties avec une propriété inexistante</title>
<title>AllowDynamicProperties avec une propriété dynamique</title>
<simpara>
Pour activer les propriétés dynamiques, ajouter
<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 avec une propriété inexistante</title>
<simpara>
À partir de PHP 8.2.0, la déclaration est requise, sauf si la classe
utilise cet attribut. La création d'une propriété non déclarée
sur une telle classe émet un avis d'obsolescence.
</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>
Expand Down
Loading