<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.oop5.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'language.oop5.properties.php',
    1 => 'Propri&eacute;t&eacute;s',
    2 => 'Propri&eacute;t&eacute;s',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Les classes et les objets',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.basic.php',
    1 => 'Syntaxe de base',
  ),
  'next' => 
  array (
    0 => 'language.oop5.property-hooks.php',
    1 => 'Hooks de propri&eacute;t&eacute;',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'language/oop5/properties.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.properties" class="sect1">
 <h2 class="title">Propriétés</h2>

 <p class="para">
  Les variables au sein d&#039;une classe sont appelées <em>propriétés</em>.
  On peut également les retrouver sous d&#039;autres dénominations telles que
  <em>champs</em>, mais pour cette documentation
  <em>propriété</em> sera utilisé.
  Elles sont définies en utilisant au moins un modificateur (tel que
  <a href="language.oop5.visibility.php" class="xref">Visibilit&eacute;</a>,
  <a href="language.oop5.static.php" class="xref">Statique</a>, ou, à partir de PHP 8.1.0,
  <a href="language.oop5.properties.php#language.oop5.properties.readonly-properties" class="link">readonly</a>),
  suivi optionnellement (sauf pour les propriétés <code class="code">readonly</code>),
  à partir de PHP 7.4, d&#039;une déclaration de type,
  suivi d&#039;une déclaration classique de variable.
  Cette déclaration peut comprendre une initialisation, mais celle-ci doit
  être une valeur <a href="language.constants.php" class="link">constante</a>.
 </p>
 <blockquote class="note"><p><strong class="note">Note</strong>: 
  <p class="simpara">
   Une manière obsolète de déclarer une propriété de classe est d&#039;utiliser
   le mot-clé <code class="literal">var</code> au lieu d&#039;un modificateur.
  </p>
 </p></blockquote>
 <blockquote class="note"><p><strong class="note">Note</strong>: 
  <p class="simpara">
   Une propriété déclarée sans modificateur de <a href="language.oop5.visibility.php" class="xref">Visibilit&eacute;</a>
   sera déclarée comme <code class="literal">public</code>.
  </p>
 </p></blockquote>
 <p class="para">
  Au sein des méthodes de classes, les propriétés non statiques peuvent être
  appelées en utilisant la syntaxe <code class="literal">-&gt;</code> (opérateur de l&#039;objet) :
  <var class="varname">$this->property</var> (où <code class="literal">property</code> est le
  nom de la propriété). Les propriétés statiques peuvent être appelées en
  utilisant la syntaxe <code class="literal">::</code> (deux doubles points) :
  <var class="varname">self::$property</var>. Se reporter à la documentation sur
  <a href="language.oop5.static.php" class="xref">Statique</a> pour plus d&#039;informations
  sur la différence entre les propriétés statiques et non statiques.
 </p>
 <p class="para">
  La pseudo-variable <var class="varname">$this</var> est disponible au sein de n&#039;importe
  quelle méthode, lorsque cette méthode est appelée au sein d&#039;un objet.
  <var class="varname">$this</var> est la valeur de l&#039;objet appelant.
 </p>

 <p class="para">
  <div class="example" id="example-1">
   <p><strong>Exemple #1 Déclarations de propriétés</strong></p>
   <div class="example-contents">
<div class="annotation-non-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #007700">class </span><span style="color: #0000BB">SimpleClass
</span><span style="color: #007700">{
   public </span><span style="color: #0000BB">$var1 </span><span style="color: #007700">= </span><span style="color: #DD0000">'hello ' </span><span style="color: #007700">. </span><span style="color: #DD0000">'world'</span><span style="color: #007700">;
   public </span><span style="color: #0000BB">$var2 </span><span style="color: #007700">= &lt;&lt;&lt;EOD
</span><span style="color: #DD0000">hello world
</span><span style="color: #007700">EOD;
   public </span><span style="color: #0000BB">$var3 </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">+</span><span style="color: #0000BB">2</span><span style="color: #007700">;
   </span><span style="color: #FF8000">// déclarations de propriétés invalides :
   </span><span style="color: #007700">public </span><span style="color: #0000BB">$var4 </span><span style="color: #007700">= </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">myStaticMethod</span><span style="color: #007700">();
   public </span><span style="color: #0000BB">$var5 </span><span style="color: #007700">= </span><span style="color: #0000BB">$myVar</span><span style="color: #007700">;

   </span><span style="color: #FF8000">// Déclarations valides de propriétés :
   </span><span style="color: #007700">public </span><span style="color: #0000BB">$var6 </span><span style="color: #007700">= </span><span style="color: #0000BB">myConstant</span><span style="color: #007700">;
   public </span><span style="color: #0000BB">$var7 </span><span style="color: #007700">= [</span><span style="color: #0000BB">true</span><span style="color: #007700">, </span><span style="color: #0000BB">false</span><span style="color: #007700">];
   public </span><span style="color: #0000BB">$var8 </span><span style="color: #007700">= &lt;&lt;&lt;'EOD'
</span><span style="color: #DD0000">hello world
</span><span style="color: #007700">EOD;

   </span><span style="color: #FF8000">// Sans modificateur de visibilité :
   </span><span style="color: #007700">static </span><span style="color: #0000BB">$var9</span><span style="color: #007700">;
   readonly </span><span style="color: #0000BB">int $var10</span><span style="color: #007700">;
}
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
   </div>

  </div>
 </p>

 <blockquote class="note"><p><strong class="note">Note</strong>: 
  <p class="para">
   Il existe des fonctions diverses qui permettent de gérer des classes et des objets.
   Voir la référence sur les <a href="ref.classobj.php" class="link">Fonctions Classes/Objets</a>.
  </p>
 </p></blockquote>

  <div class="sect2" id="language.oop5.properties.typed-properties">
   <h3 class="title">Déclarations des types</h3>

  <p class="para">
   À partir de PHP 7.4.0, les définitions de propriétés peuvent inclure une
   <a href="language.types.declarations.php" class="xref">D&eacute;clarations de type</a>,
   avec l&#039;exception du type <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>.
   <div class="example" id="example-2">
    <p><strong>Exemple #2 Exemple de propriétés typées</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</span><span style="color: #007700">class </span><span style="color: #0000BB">User
</span><span style="color: #007700">{
    public </span><span style="color: #0000BB">int $id</span><span style="color: #007700">;
    public ?</span><span style="color: #0000BB">string $name</span><span style="color: #007700">;

    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">int $id</span><span style="color: #007700">, ?</span><span style="color: #0000BB">string $name</span><span style="color: #007700">)
    {
        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">id </span><span style="color: #007700">= </span><span style="color: #0000BB">$id</span><span style="color: #007700">;
        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name </span><span style="color: #007700">= </span><span style="color: #0000BB">$name</span><span style="color: #007700">;
    }
}

</span><span style="color: #0000BB">$user </span><span style="color: #007700">= new </span><span style="color: #0000BB">User</span><span style="color: #007700">(</span><span style="color: #0000BB">1234</span><span style="color: #007700">, </span><span style="color: #0000BB">null</span><span style="color: #007700">);

</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$user</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">id</span><span style="color: #007700">);
</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$user</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">);

</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
    </div>

    <div class="example-contents"><p>L&#039;exemple ci-dessus va afficher :</p></div>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
int(1234)
NULL
</pre></div>
    </div>
   </div>
  </p>
   <p class="para">
    Les propriétés typées doivent être initialisées avant d&#039;y accéder, sinon,
    une <span class="classname"><a href="class.error.php" class="classname">Error</a></span> sera émise.
    <div class="example" id="example-3">
     <p><strong>Exemple #3 Accès aux propriétés</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</span><span style="color: #007700">class </span><span style="color: #0000BB">Shape
</span><span style="color: #007700">{
    public </span><span style="color: #0000BB">int $numberOfSides</span><span style="color: #007700">;
    public </span><span style="color: #0000BB">string $name</span><span style="color: #007700">;

    public function </span><span style="color: #0000BB">setNumberOfSides</span><span style="color: #007700">(</span><span style="color: #0000BB">int $numberOfSides</span><span style="color: #007700">): </span><span style="color: #0000BB">void
    </span><span style="color: #007700">{
        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">numberOfSides </span><span style="color: #007700">= </span><span style="color: #0000BB">$numberOfSides</span><span style="color: #007700">;
    }

    public function </span><span style="color: #0000BB">setName</span><span style="color: #007700">(</span><span style="color: #0000BB">string $name</span><span style="color: #007700">): </span><span style="color: #0000BB">void
    </span><span style="color: #007700">{
        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name </span><span style="color: #007700">= </span><span style="color: #0000BB">$name</span><span style="color: #007700">;
    }

    public function </span><span style="color: #0000BB">getNumberOfSides</span><span style="color: #007700">(): </span><span style="color: #0000BB">int
    </span><span style="color: #007700">{
        return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">numberOfSides</span><span style="color: #007700">;
    }

    public function </span><span style="color: #0000BB">getName</span><span style="color: #007700">(): </span><span style="color: #0000BB">string
    </span><span style="color: #007700">{
        return </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">;
    }
}

</span><span style="color: #0000BB">$triangle </span><span style="color: #007700">= new </span><span style="color: #0000BB">Shape</span><span style="color: #007700">();
</span><span style="color: #0000BB">$triangle</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setName</span><span style="color: #007700">(</span><span style="color: #DD0000">"triangle"</span><span style="color: #007700">);
</span><span style="color: #0000BB">$triangle</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setNumberOfSides</span><span style="color: #007700">(</span><span style="color: #0000BB">3</span><span style="color: #007700">);
</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$triangle</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getName</span><span style="color: #007700">());
</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$triangle</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getNumberOfSides</span><span style="color: #007700">());

</span><span style="color: #0000BB">$circle </span><span style="color: #007700">= new </span><span style="color: #0000BB">Shape</span><span style="color: #007700">();
</span><span style="color: #0000BB">$circle</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setName</span><span style="color: #007700">(</span><span style="color: #DD0000">"circle"</span><span style="color: #007700">);
</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$circle</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getName</span><span style="color: #007700">());
</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$circle</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getNumberOfSides</span><span style="color: #007700">());
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
     </div>

     <div class="example-contents"><p>L&#039;exemple ci-dessus va afficher :</p></div>
     <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
string(8) &quot;triangle&quot;
int(3)
string(6) &quot;circle&quot;

Fatal error: Uncaught Error: Typed property Shape::$numberOfSides must not be accessed before initialization
</pre></div>
     </div>
    </div>
   </p>
  </div>

 <div class="sect2" id="language.oop5.properties.readonly-properties">
  <h3 class="title">Propriétés en lecture seule (readonly)</h3>
  <p class="para">
   À partir de PHP 8.1.0, une propriété peut être déclarée avec le modificateur <code class="literal">readonly</code>,
   qui empêche la modification de la propriété après l&#039;initialisation.  Avant PHP 8.4.0
    une propriété <code class="literal">readonly</code> est implicitement privée-modifiable, et ne peut être écrite
    que depuis la même classe. À partir de PHP 8.4.0, les propriétés <code class="literal">readonly</code> sont implicitement
    <a href="language.oop5.visibility.php#language.oop5.visibility-members-aviz" class="link"><code class="literal">protected(set)</code></a>,
    elles peuvent donc être définies depuis des classes enfants. Cela peut être remplacé
    explicitement si désiré.
   <div class="example" id="example-4">
    <p><strong>Exemple #4 Exemple de propriétés en lecture seule</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</span><span style="color: #007700">class </span><span style="color: #0000BB">Test </span><span style="color: #007700">{
   public readonly </span><span style="color: #0000BB">string $prop</span><span style="color: #007700">;

   public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">string $prop</span><span style="color: #007700">) {
       </span><span style="color: #FF8000">// Initialisation légale.
       </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop </span><span style="color: #007700">= </span><span style="color: #0000BB">$prop</span><span style="color: #007700">;
   }
}

</span><span style="color: #0000BB">$test </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test</span><span style="color: #007700">(</span><span style="color: #DD0000">"foobar"</span><span style="color: #007700">);
</span><span style="color: #FF8000">// Lecture légale.
</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop</span><span style="color: #007700">); </span><span style="color: #FF8000">// string(6) "foobar"

// Réaffectation illégale. Peu importe que la valeur assignée soit identique.
</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop </span><span style="color: #007700">= </span><span style="color: #DD0000">"foobar"</span><span style="color: #007700">;
</span><span style="color: #FF8000">// Erreur : Cannot modify readonly property Test::$prop
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
    </div>

   </div>
   <blockquote class="note"><p><strong class="note">Note</strong>: 
    <p class="para">
     Le modificateur de lecture seule ne peut être appliqué qu&#039;aux
     <a href="language.oop5.properties.php#language.oop5.properties.typed-properties" class="link">propriétés typées</a>.
     Une propriété en lecture seule sans contrainte de type peut être créée en
     utilisant le type <a href="language.types.mixed.php" class="xref">Mixed</a>.
    </p>
   </p></blockquote>
   <blockquote class="note"><p><strong class="note">Note</strong>: 
    <p class="para">
     Les propriétés statiques en lecture seule ne sont pas supportées.
    </p>
   </p></blockquote>
  </p>
  <p class="para">
   Une propriété en lecture seule ne peut être initialisée qu&#039;une seule fois,
   et seulement depuis la portée dans laquelle elle a été déclarée.
   Toute autre affectation ou modification de la propriété résultera en une
   exception <span class="classname"><a href="class.error.php" class="classname">Error</a></span>.
   <div class="example" id="example-5">
    <p><strong>Exemple #5 Initialisation illégale de propriétés en lecture seule</strong></p>
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #007700">class </span><span style="color: #0000BB">Test1 </span><span style="color: #007700">{
    public readonly </span><span style="color: #0000BB">string $prop</span><span style="color: #007700">;
}

</span><span style="color: #0000BB">$test1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test1</span><span style="color: #007700">;
</span><span style="color: #FF8000">// Initialisation illégale en dehors de la portée privée.
</span><span style="color: #0000BB">$test1</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop </span><span style="color: #007700">= </span><span style="color: #DD0000">"foobar"</span><span style="color: #007700">;
</span><span style="color: #FF8000">// Erreur : Cannot initialize readonly property Test1::$prop from global scope
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
    </div>

   </div>
  </p>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Les propriétés en lecture seule ne peuvent être initialisées que par une
    assignation directe. Une propriété en lecture seule non initialisée ne peut
    pas être initialisée par référence, même depuis la portée où elle a été
    déclarée : la passer à un paramètre de fonction qui attend une référence,
    ou l&#039;assigner par référence, lève une exception
    <span class="exceptionname"><a href="class.error.php" class="exceptionname">Error</a></span>.
    <div class="informalexample">
     <div class="example-contents">
<div class="annotation-non-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</span><span style="color: #007700">class </span><span style="color: #0000BB">Test </span><span style="color: #007700">{
    public readonly array </span><span style="color: #0000BB">$matches</span><span style="color: #007700">;

    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">string $subject</span><span style="color: #007700">) {
        </span><span style="color: #FF8000">// Initialisation illégale par référence.
        </span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">'/\d+/'</span><span style="color: #007700">, </span><span style="color: #0000BB">$subject</span><span style="color: #007700">, </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">matches</span><span style="color: #007700">);
        </span><span style="color: #FF8000">// Erreur : Cannot indirectly modify readonly property Test::$matches
    </span><span style="color: #007700">}
}

new </span><span style="color: #0000BB">Test</span><span style="color: #007700">(</span><span style="color: #DD0000">'abc 42'</span><span style="color: #007700">);
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
     </div>

    </div>
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Spécifier une valeur par défaut explicite à une propriété en lecture seule
    n&#039;est pas autorisé, car une propriété en lecture seule avec une valeur par
    défaut est essentiellement identique à une constante, et par conséquent
    pas particulièrement utile.
    <div class="informalexample">
     <div class="example-contents">
<div class="annotation-non-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</span><span style="color: #007700">class </span><span style="color: #0000BB">Test </span><span style="color: #007700">{
    </span><span style="color: #FF8000">// Erreur fatale : Readonly property Test::$prop cannot have default value
    </span><span style="color: #007700">public readonly </span><span style="color: #0000BB">int $prop </span><span style="color: #007700">= </span><span style="color: #0000BB">42</span><span style="color: #007700">;
}
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
     </div>

    </div>
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Les propriétés en lecture seule ne peuvent pas être
    <span class="function"><a href="function.unset.php" class="function">unset()</a></span> une fois qu&#039;elles ont été initialisées.
    Cependant, il est possible de unset une propriété en lecture seule avant
    son initialisation, depuis la portée où la propriété a été déclarée.
   </p>
  </p></blockquote>
  <p class="para">
   Les modifications ne sont pas nécessairement des affectations simples,
   tous les exemples suivants résulteront en une exception <span class="classname"><a href="class.error.php" class="classname">Error</a></span> :
   <div class="informalexample">
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</span><span style="color: #007700">class </span><span style="color: #0000BB">Test </span><span style="color: #007700">{
    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(
        public readonly </span><span style="color: #0000BB">int $i </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">,
        public readonly array </span><span style="color: #0000BB">$ary </span><span style="color: #007700">= [],
    ) {}
}

</span><span style="color: #0000BB">$test </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test</span><span style="color: #007700">;
</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">i </span><span style="color: #007700">+= </span><span style="color: #0000BB">1</span><span style="color: #007700">;
</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">i</span><span style="color: #007700">++;
++</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">i</span><span style="color: #007700">;
</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ary</span><span style="color: #007700">[] = </span><span style="color: #0000BB">1</span><span style="color: #007700">;
</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ary</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">][] = </span><span style="color: #0000BB">1</span><span style="color: #007700">;
unset(</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">ary</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]);
</span><span style="color: #0000BB">$ref </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">i</span><span style="color: #007700">;
</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">i </span><span style="color: #007700">=&amp; </span><span style="color: #0000BB">$ref</span><span style="color: #007700">;
</span><span style="color: #0000BB">byRef</span><span style="color: #007700">(</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">i</span><span style="color: #007700">);
foreach (</span><span style="color: #0000BB">$test </span><span style="color: #007700">as &amp;</span><span style="color: #0000BB">$prop</span><span style="color: #007700">);
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
    </div>

   </div>
  </p>
  <p class="para">
   Cependant, les propriétés en lecture seule n&#039;excluent pas la mutabilité intérieure.
   Les objets (ou ressources) stockés dans les propriétés en lecture seule
   peuvent toujours être modifiés en interne :
   <div class="informalexample">
    <div class="example-contents">
<div class="annotation-non-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php

</span><span style="color: #007700">class </span><span style="color: #0000BB">Test </span><span style="color: #007700">{
    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(public readonly </span><span style="color: #0000BB">object $obj</span><span style="color: #007700">) {}
}

</span><span style="color: #0000BB">$test </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test</span><span style="color: #007700">(new </span><span style="color: #0000BB">stdClass</span><span style="color: #007700">);
</span><span style="color: #FF8000">// Mutation interne légale.
</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">obj</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">foo </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;
</span><span style="color: #FF8000">// Réaffectation illégale.
</span><span style="color: #0000BB">$test</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">stdClass</span><span style="color: #007700">;
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
    </div>

   </div>
  </p>
  <p class="para">
   À partir de PHP 8.3.0, les propriétés en lecture seule peuvent être réinitialisées lors du clonage d&#039;un objet
   en utilisant la méthode <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>.
   <div class="example" id="example-6">
    <p><strong>Exemple #6 Propriétés en lecture seule et clonage</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><pre><code style="color: #000000"><span style="color: #0000BB">&lt;?php
</span><span style="color: #007700">class </span><span style="color: #0000BB">Test1 </span><span style="color: #007700">{
    public readonly ?</span><span style="color: #0000BB">string $prop</span><span style="color: #007700">;

    public function </span><span style="color: #0000BB">__clone</span><span style="color: #007700">() {
        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;
    }

    public function </span><span style="color: #0000BB">setProp</span><span style="color: #007700">(</span><span style="color: #0000BB">string $prop</span><span style="color: #007700">): </span><span style="color: #0000BB">void </span><span style="color: #007700">{
        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop </span><span style="color: #007700">= </span><span style="color: #0000BB">$prop</span><span style="color: #007700">;
    }
}

</span><span style="color: #0000BB">$test1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Test1</span><span style="color: #007700">;
</span><span style="color: #0000BB">$test1</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setProp</span><span style="color: #007700">(</span><span style="color: #DD0000">'foobar'</span><span style="color: #007700">);

</span><span style="color: #0000BB">$test2 </span><span style="color: #007700">= clone </span><span style="color: #0000BB">$test1</span><span style="color: #007700">;
</span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$test2</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">prop</span><span style="color: #007700">); </span><span style="color: #FF8000">// NULL
</span><span style="color: #0000BB">?&gt;</span></code></pre></div>
    </div>

   </div>
  </p>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="simpara">
    À partir de PHP 8.4.0, la modification indirecte d&#039;une propriété
    <code class="literal">readonly</code> au sein de
    <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>, comme l&#039;obtention d&#039;une
    référence vers celle-ci (<code class="code">$ref = &amp;$this-&gt;prop</code>), n&#039;est plus
    autorisée. Cela était déjà interdit lors de l&#039;initialisation d&#039;une
    propriété <code class="literal">readonly</code>.
   </p>
  </p></blockquote>
 </div>

 <div class="sect2" id="language.oop5.properties.dynamic-properties">
  <h3 class="title">Propriétés dynamiques</h3>
  <p class="para">
   Lors d&#039;une tentative d&#039;assignation à une propriété non existante sur un
   <a href="language.types.object.php" class="link">objet</a>, PHP créera automatiquement une propriété correspondante.
   Cette propriété créée dynamiquement sera <em>uniquement</em>
   disponible sur cette instance de classe.
  </p>
  <p class="simpara">
   Les propriétés dynamiques sont supportées par
   <a href="class.stdclass.php#stdclass.intro" class="link">stdClass</a> et ses classes filles.
   Les autres classes peuvent activer un comportement similaire avec
   <a href="class.allowdynamicproperties.php#allowdynamicproperties.intro" class="link">AllowDynamicProperties</a>
   ou la <a href="language.oop5.overloading.php" class="link">surcharge de propriétés</a>.
  </p>
  <div class="warning"><strong class="warning">Avertissement</strong>
   <p class="simpara">
    La création d&#039;une propriété dynamique est obsolète à partir de PHP 8.2.0,
    sauf si la classe est marquée avec l&#039;attribut
    <code class="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 <a href="language.oop5.overloading.php#object.get" class="link">__get()</a> et
    <a href="language.oop5.overloading.php#object.set" class="link">__set()</a>.
    Marquer la classe avec l&#039;attribut reste une option, mais est
    généralement considéré comme un dernier recours.
   </p>
  </div>
 </div>

</div><?php manual_footer($setup); ?>