<?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 => 'es',
  ),
  'this' => 
  array (
    0 => 'language.oop5.properties.php',
    1 => 'Propiedades',
    2 => 'Propiedades',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Clases y objetos',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.basic.php',
    1 => 'Sintaxis b&aacute;sica',
  ),
  'next' => 
  array (
    0 => 'language.oop5.property-hooks.php',
    1 => 'Hooks de propiedad',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    '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">Propiedades</h2>

 <p class="para">
  Las variables dentro de una clase se denominan <em>propiedades</em>.
  También pueden encontrarse bajo otros nombres como
  <em>campos</em>, pero para esta documentación
  se utilizará <em>propiedad</em>.
  Se definen utilizando al menos un modificador (como
  <a href="language.oop5.visibility.php" class="xref">Visibilidad</a>,
  <a href="language.oop5.static.php" class="xref">Est&aacute;tico</a>, o, a partir de PHP 8.1.0,
  <a href="language.oop5.properties.php#language.oop5.properties.readonly-properties" class="link">readonly</a>),
  seguido opcionalmente (excepto para las propiedades <code class="code">readonly</code>),
  a partir de PHP 7.4, de una declaración de tipo,
  seguida de una declaración clásica de variable.
  Esta declaración puede incluir una inicialización, pero esta debe
  ser un valor <a href="language.constants.php" class="link">constante</a>
 </p>
 <blockquote class="note"><p><strong class="note">Nota</strong>: 
  <p class="simpara">
   Una manera obsoleta de declarar una propiedad de clase es utilizar
   la palabra clave <code class="literal">var</code> en lugar de un modificador.
  </p>
 </p></blockquote>
 <blockquote class="note"><p><strong class="note">Nota</strong>: 
  <p class="simpara">
   Una propiedad declarada sin modificador de <a href="language.oop5.visibility.php" class="xref">Visibilidad</a>
   será declarada como <code class="literal">public</code>.
  </p>
 </p></blockquote>
 <p class="para">
  Dentro de los métodos de clases, las propiedades no estáticas pueden ser
  llamadas utilizando la sintaxis <code class="literal">-&gt;</code> (operador de objeto) :
  <var class="varname">$this->property</var> (donde <code class="literal">property</code> es el
  nombre de la propiedad). Las propiedades estáticas pueden ser llamadas utilizando la sintaxis <code class="literal">::</code> (dos puntos) :
  <var class="varname">self::$property</var>. Consulte la documentación sobre
  <a href="language.oop5.static.php" class="xref">Est&aacute;tico</a> para más información
  sobre la diferencia entre las propiedades estáticas y no estáticas.
 </p>
 <p class="para">
  La pseudo-variable <var class="varname">$this</var> está disponible dentro de cualquier
  método, cuando este método es llamado dentro de un objeto.
  <var class="varname">$this</var> es el valor del objeto que llama.
 </p>

 <p class="para">
  <div class="example" id="example-1">
   <p><strong>Ejemplo #1 Declaraciones de propiedades</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">// declaración de propiedad no válida :
   </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">// Declaraciones válidas de propiedades :
   </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">// Sin modificador de visibilidad :
   </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">Nota</strong>: 
  <p class="para">
   Existen diversas funciones que permiten gestionar clases y objetos.
   Ver la referencia sobre las <a href="ref.classobj.php" class="link">Funciones Clases/Objetos</a>.
  </p>
 </p></blockquote>

  <div class="sect2" id="language.oop5.properties.typed-properties">
   <h3 class="title">Declaraciones de tipos</h3>

  <p class="para">
   A partir de PHP 7.4.0, las definiciones de propiedades pueden incluir una
   <a href="language.types.declarations.php" class="xref">Declaraciones de tipo</a>,
   con la excepción del tipo <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>.
   <div class="example" id="example-2">
    <p><strong>Ejemplo #2 Ejemplo de propiedades tipadas</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">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>El ejemplo anterior mostrará:</p></div>
    <div class="example-contents screen">
<div class="cdata"><pre>
int(1234)
NULL
</pre></div>
    </div>
   </div>
  </p>
   <p class="para">
    Las propiedades tipadas deben ser inicializadas antes de acceder a ellas, de lo contrario,
    se emitirá un <span class="classname"><a href="class.error.php" class="classname">Error</a></span>.
    <div class="example" id="example-3">
     <p><strong>Ejemplo #3 Acceso a propiedades</strong></p>
     <div class="example-contents">
<div class="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>El ejemplo anterior mostrará:</p></div>
     <div class="example-contents screen">
<div class="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">Propiedades de solo lectura (readonly)</h3>
  <p class="para">
   A partir de PHP 8.1.0, una propiedad puede ser declarada con el modificador <code class="literal">readonly</code>,
   lo que impide la modificación de la propiedad después de la inicialización.   Antes de PHP 8.4.0
    una propiedad <code class="literal">readonly</code> es implícitamente privada-modificable, y solo puede ser escrita
    desde la misma clase. A partir de PHP 8.4.0, las propiedades <code class="literal">readonly</code> son implícitamente
    <a href="language.oop5.visibility.php#language.oop5.visibility-members-aviz" class="link"><code class="literal">protected(set)</code></a>,
    por lo que pueden ser definidas desde clases hijas. Esto puede ser reemplazado
    explícitamente si se desea.
   <div class="example" id="example-4">
    <p><strong>Ejemplo #4 Ejemplo de propiedades de solo lectura</strong></p>
    <div class="example-contents">
<div class="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">// Inicialización legal.
       </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">// Lectura legal.
</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"

// Reasignación ilegal. No importa que el valor asignado sea idéntico.
</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">// Error: 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">Nota</strong>: 
    <p class="para">
     El modificador de solo lectura solo puede ser aplicado a
     <a href="language.oop5.properties.php#language.oop5.properties.typed-properties" class="link">propiedades tipadas</a>.
     Una propiedad de solo lectura sin restricción de tipo puede ser creada utilizando el tipo <a href="language.types.mixed.php" class="xref">Mixed</a>.
    </p>
   </p></blockquote>
   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="para">
     Las propiedades estáticas de solo lectura no son soportadas.
    </p>
   </p></blockquote>
  </p>
  <p class="para">
   Una propiedad de solo lectura solo puede ser inicializada una vez,
   y solo desde el ámbito en el que fue declarada. Cualquier otra asignación o modificación de la propiedad resultará en una
   excepción <span class="classname"><a href="class.error.php" class="classname">Error</a></span>.
   <div class="example" id="example-5">
    <p><strong>Ejemplo #5 Inicialización ilegal de propiedades de solo lectura</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">// Inicialización ilegal fuera del ámbito privado.
</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">// Error: 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">Nota</strong>: 
   <p class="para">
    Las propiedades de solo lectura solo pueden inicializarse mediante una asignación directa.
    Una propiedad de solo lectura no inicializada no puede inicializarse por referencia, ni siquiera
    desde el ámbito en el que ha sido declarada: pasarla a un parámetro de función que espera
    ser pasado por referencia, o asignarla por referencia, produce una excepción
    <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">// Inicialización ilegal por referencia.
        </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">// Error: 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">Nota</strong>: 
   <p class="para">
    Especificar un valor por defecto explícito a una propiedad de solo lectura
    no está permitido, ya que una propiedad de solo lectura con un valor por defecto es esencialmente idéntica a una constante, y por lo tanto
    no particularmente útil.
    <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">// Fatal error: 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">Nota</strong>: 
   <p class="para">
    Las propiedades de solo lectura no pueden ser
    <span class="function"><a href="function.unset.php" class="function">unset()</a></span> una vez que han sido inicializadas.
    Sin embargo, es posible unset una propiedad de solo lectura antes
    de su inicialización, desde el ámbito donde la propiedad fue declarada.
   </p>
  </p></blockquote>
  <p class="para">
   Las modificaciones no son necesariamente asignaciones simples,
   todos los ejemplos siguientes resultarán en una excepción <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">
   Sin embargo, las propiedades de solo lectura no excluyen la mutabilidad interna.
   Los objetos (o recursos) almacenados en las propiedades de solo lectura
   pueden ser modificados internamente :
   <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">// Mutación interna legal.
</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">// Reasignación ilegal.
</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">
   A partir de PHP 8.3.0, las propiedades de solo lectura pueden ser reinicializadas al clonar un objeto
   utilizando el método <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>.
   <div class="example" id="example-6">
    <p><strong>Ejemplo #6 Propiedades de solo lectura y clonación</strong></p>
    <div class="example-contents">
<div class="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">Nota</strong>: 
   <p class="simpara">
    A partir de PHP 8.4.0, la modificación indirecta de una propiedad readonly
    dentro de <a href="language.oop5.cloning.php#object.clone" class="link">__clone()</a>, como obtener una
    referencia a ella (<code class="code">$ref = &amp;$this-&gt;prop</code>), ya no está
    permitida. Esto ya estaba prohibido durante la inicialización readonly.
   </p>
  </p></blockquote>
 </div>

 <div class="sect2" id="language.oop5.properties.dynamic-properties">
  <h3 class="title">Propiedades Dinámicas</h3>
  <p class="para">
   Al intentar asignar a una propiedad no existente en un
   <span class="type"><a href="language.types.object.php" class="type object">object</a></span>, PHP creará automáticamente una propiedad correspondiente.
   Esta propiedad creada dinámicamente estará <em>únicamente</em>
   disponible en esta instancia de clase.
  </p>

  <div class="warning"><strong class="warning">Advertencia</strong>
   <p class="simpara">
    Las propiedades dinámicas están obsoletas a partir de PHP 8.2.0.
    Se recomienda declarar la propiedad en su lugar.
    Para manejar nombres de propiedades arbitrarios, la clase debería implementar
    los métodos mágicos <a href="language.oop5.overloading.php#object.get" class="link">__get()</a> y
    <a href="language.oop5.overloading.php#object.set" class="link">__set()</a>.
    Como último recurso, la clase puede ser marcada con el atributo
    <code class="code">#[\AllowDynamicProperties]</code>.
   </p>
  </div>
 </div>

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