<?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.decon.php',
    1 => 'Constructores y destructores',
    2 => 'Constructores y destructores',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Clases y objetos',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.autoload.php',
    1 => 'Autocarga de clases',
  ),
  'next' => 
  array (
    0 => 'language.oop5.visibility.php',
    1 => 'Visibilidad',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'language/oop5/decon.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.oop5.decon" class="sect1">
  <h2 class="title">Constructores y destructores</h2>

  <div class="sect2" id="language.oop5.decon.constructor">
   <h3 class="title">Constructor</h3>
   <div class="methodsynopsis dc-description" id="object.construct">
    <span class="methodname"><strong>__construct</strong></span>(<span class="methodparam"><span class="type"><a href="language.types.mixed.php" class="type mixed">mixed</a></span> <code class="parameter">...$values</code><span class="initializer"> = &quot;&quot;</span></span>): <span class="type"><a href="language.types.void.php" class="type void">void</a></span></div>

   <p class="para">
    PHP permite a los desarrolladores declarar constructores para
    las clases. Las clases que poseen un método constructor
    llaman a este método cada vez que se crea una nueva instancia
    del objeto, lo cual es interesante para todas las inicializaciones
    de las que el objeto necesita antes de ser utilizado.
   </p>
   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     Los constructores padres no son llamados implícitamente
     si la clase hija define un constructor. Si se
     desea utilizar un constructor padre, será necesario hacer
     llamada a <span class="function"><strong>parent::__construct()</strong></span> desde el constructor hijo.
     Si el hijo no define un constructor entonces, puede ser heredado
     de la clase padre, exactamente de la misma forma que una método lo sería
     (si no ha sido declarado como privado).
    </span>
   </p></blockquote>
   <div class="example" id="example-1">
    <p><strong>Ejemplo #1 Constructor durante la herencia</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">BaseClass </span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() {<br />        print </span><span style="color: #DD0000">"En el constructor de BaseClass\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">SubClass </span><span style="color: #007700">extends </span><span style="color: #0000BB">BaseClass </span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() {<br />        </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">__construct</span><span style="color: #007700">();<br />        print </span><span style="color: #DD0000">"En el constructor de SubClass\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br />class </span><span style="color: #0000BB">OtherSubClass </span><span style="color: #007700">extends </span><span style="color: #0000BB">BaseClass </span><span style="color: #007700">{<br />    </span><span style="color: #FF8000">// Constructor heredado de BaseClass<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #FF8000">// En el constructor de BaseClass<br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">BaseClass</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// En el constructor de BaseClass<br />// En el constructor de SubClass<br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">SubClass</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// En el constructor de BaseClass<br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">OtherSubClass</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="para">
    A diferencia de otros métodos, <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a>
    está excluido de las <a href="language.oop5.basic.php#language.oop.lsp" class="link">reglas de compatibilidad de firmas</a>
    usuales cuando se extiende.
   </p>
   <p class="para">
    Los constructores son métodos ordinarios que son llamados durante
    la instanciación de su objeto correspondiente. Por lo tanto, pueden
    definir un número arbitrario de argumentos, que pueden ser requeridos, tener un tipo,
    y pueden tener un valor por defecto. Los argumentos de un constructor son llamados
    colocando los argumentos dentro de paréntesis después del nombre de la clase.
   </p>
   <div class="example" id="example-2">
    <p><strong>Ejemplo #2 Utilizar los argumentos de un constructor</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Point </span><span style="color: #007700">{<br />    protected </span><span style="color: #0000BB">int $x</span><span style="color: #007700">;<br />    protected </span><span style="color: #0000BB">int $y</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">int $x</span><span style="color: #007700">, </span><span style="color: #0000BB">int $y </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">x </span><span style="color: #007700">= </span><span style="color: #0000BB">$x</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">y </span><span style="color: #007700">= </span><span style="color: #0000BB">$y</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #FF8000">// Pasar ambos parámetros.<br /></span><span style="color: #0000BB">$p1 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Point</span><span style="color: #007700">(</span><span style="color: #0000BB">4</span><span style="color: #007700">, </span><span style="color: #0000BB">5</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// Pasar solo el parámetro requerido. $y tomará su valor por defecto de 0.<br /></span><span style="color: #0000BB">$p2 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Point</span><span style="color: #007700">(</span><span style="color: #0000BB">4</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// Con parámetros nombrados (a partir de PHP 8.0):<br /></span><span style="color: #0000BB">$p3 </span><span style="color: #007700">= new </span><span style="color: #0000BB">Point</span><span style="color: #007700">(</span><span style="color: #0000BB">y</span><span style="color: #007700">: </span><span style="color: #0000BB">5</span><span style="color: #007700">, </span><span style="color: #0000BB">x</span><span style="color: #007700">: </span><span style="color: #0000BB">4</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   <p class="para">
    Si una clase no tiene un constructor, o si el constructor no tiene argumentos requeridos,
    los paréntesis pueden ser omitidos.
   </p>
   <div class="sect3">
    <h4 class="title">Estilo antiguo de los constructores</h4>
    <p class="para">
     Anterior a PHP 8.0.0, las clases en el espacio de nombres global interpretarán un
     método que tenga el mismo nombre que la clase como un constructor de estilo antiguo.
     Esta sintaxis está obsoleta, y resultará en un error <strong><code><a href="errorfunc.constants.php#constant.e-deprecated">E_DEPRECATED</a></code></strong>
     pero llamará a esta función como un constructor.
     Si <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a> y un método con el mismo nombre
     están definidos, <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a> será llamado.
    </p>
    <p class="para">
     Las clases en espacios de nombres, o cualquier clase a partir de PHP 8.0.0,
     un método con el mismo nombre que la clase nunca tiene un significado particular.
    </p>
    <p class="para">
     Siempre utilizar <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a> en nuevo código.
    </p>
   </div>
   <div class="sect3" id="language.oop5.decon.constructor.promotion">
    <h4 class="title">Promoción del Constructor</h4>
    <p class="para">
     A partir de PHP 8.0.0, los parámetros del constructor pueden ser promovidos para
     corresponder a una propiedad del objeto. Es muy común que los parámetros
     de un constructor sean asignados a una propiedad sin realizar operaciones sobre ellos.
     La promoción del constructor proporciona un atajo para este caso de uso.
     El ejemplo anterior puede ser reescrito de la siguiente manera.
    </p>
    <div class="example" id="example-3">
     <p><strong>Ejemplo #3 Utilizando la promoción de propiedad de constructor</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Point </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(protected </span><span style="color: #0000BB">int $x</span><span style="color: #007700">, protected </span><span style="color: #0000BB">int $y </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">) {<br />    }<br />}</span></span></code></div>
     </div>

    </div>
    <p class="para">
     Cuando un argumento de constructor incluye un modificador, PHP lo interpretará
     como una propiedad de objeto y un argumento del constructor, y asignará el valor del argumento
     a la propiedad. El cuerpo del constructor puede estar entonces vacío o puede contener otras
     declaraciones. Todas las declaraciones adicionales serán ejecutadas después de que el valor del
     argumento haya sido asignado a su propiedad correspondiente.
    </p>
    <p class="para">
     Todos los argumentos no necesitan ser promovidos. Es posible mezclar y combinar los
     argumentos promovidos y no promovidos, en cualquier orden. Los argumentos promovidos no tienen ningún impacto
     en el código que llama al constructor.
    </p>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      Utilizar un <a href="language.oop5.visibility.php" class="link">modificador de visibilidad</a>
      (<code class="literal">public</code>, <code class="literal">protected</code> o <code class="literal">private</code>) es
      la manera más probable de aplicar la promoción de propiedad, pero cualquier otro modificador
      único (como <code class="literal">readonly</code>) tendrá el mismo efecto.
     </p>
    </p></blockquote>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      Las propiedades de objeto no pueden ser tipadas <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> debido a las ambigüedades del motor
      que esto introduciría. Por lo tanto, los argumentos promovidos, tampoco pueden ser tipados
      <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>. Sin embargo, cualquier otra
      <a href="language.types.declarations.php" class="link">declaración de tipo</a> está permitida.
     </p>
    </p></blockquote>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      Como las propiedades promovidas son a la vez desucradas a una propiedad
      y también como el parámetro de una función, todas las restricciones de
      nombramiento para las propiedades y los parámetros se aplican.
     </p>
    </p></blockquote>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      Los <a href="language.attributes.php" class="link">atributos</a> colocados sobre un
      argumento de constructor promovido serán replicados tanto en la
      propiedad como en el argumento. Los valores por defecto en un argumento de
      constructor promovido solo serán replicados en el argumento y no en la propiedad.
     </p>
    </p></blockquote>
   </div>

   <div class="sect3" id="language.oop5.decon.constructor.new">
    <h4 class="title">Novedades en inicializadores</h4>
    <p class="para">
     A partir de PHP 8.1.0, los objetos pueden ser utilizados como valor por defecto para los parámetros,
     variables estáticas, constantes globales y los argumentos de atributos.
     Los objetos pueden ser ahora pasados a <span class="function"><a href="function.define.php" class="function">define()</a></span>.
    </p>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      El uso de un nombre de clase dinámico o no-string o una clase anónima no está permitido.
      El uso del desempacado de argumentos no está permitido.
      El uso de expresiones no soportadas como argumento no está permitido.
     </p>
    </p></blockquote>
    <div class="example" id="example-4">
     <p><strong>Ejemplo #4 Uso de new en inicializadores</strong></p>
     <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #FF8000">// Todos permitidos:<br /></span><span style="color: #007700">static </span><span style="color: #0000BB">$x </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">;<br /><br />const </span><span style="color: #0000BB">C </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">;<br /><br />function </span><span style="color: #0000BB">test</span><span style="color: #007700">(</span><span style="color: #0000BB">$param </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">) {}<br /><br />#[</span><span style="color: #0000BB">AnAttribute</span><span style="color: #007700">(new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">)]<br />class </span><span style="color: #0000BB">Test </span><span style="color: #007700">{<br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(<br />        public </span><span style="color: #0000BB">$prop </span><span style="color: #007700">= new </span><span style="color: #0000BB">Foo</span><span style="color: #007700">,<br />    ) {}<br />}<br /><br /></span><span style="color: #FF8000">// Todos no permitidos (error de compilación):<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">test</span><span style="color: #007700">(<br />    </span><span style="color: #0000BB">$a </span><span style="color: #007700">= new (</span><span style="color: #0000BB">CLASS_NAME_CONSTANT</span><span style="color: #007700">)(), </span><span style="color: #FF8000">// nombre de clase dinámico<br />    </span><span style="color: #0000BB">$b </span><span style="color: #007700">= new class {}, </span><span style="color: #FF8000">// clase anónima<br />    </span><span style="color: #0000BB">$c </span><span style="color: #007700">= new </span><span style="color: #0000BB">A</span><span style="color: #007700">(...[]), </span><span style="color: #FF8000">// desempacado de argumentos<br />    </span><span style="color: #0000BB">$d </span><span style="color: #007700">= new </span><span style="color: #0000BB">B</span><span style="color: #007700">(</span><span style="color: #0000BB">$abc</span><span style="color: #007700">), </span><span style="color: #FF8000">// expresión de constante no soportada<br /></span><span style="color: #007700">) {}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </div>

   <div class="sect3" id="language.oop5.decon.constructor.static">
    <h4 class="title">Método de creación estático</h4>
    <p class="para">
     PHP soporta únicamente un constructor por clase. Sin embargo, en
     ciertos casos puede ser deseable permitir que un objeto sea construido
     de manera diferente con entradas diferentes.
     La forma recomendada de hacer esto es utilizando métodos estáticos
     como una envolvente del constructor.
    </p>
    <div class="example" id="example-5">
     <p><strong>Ejemplo #5 Utilizando la creación mediante un método estático</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$some_json_string </span><span style="color: #007700">= </span><span style="color: #DD0000">'{ "id": 1004, "name": "Elephpant" }'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$some_xml_string </span><span style="color: #007700">= </span><span style="color: #DD0000">"&lt;animal&gt;&lt;id&gt;1005&lt;/id&gt;&lt;name&gt;Elephpant&lt;/name&gt;&lt;/animal&gt;"</span><span style="color: #007700">;<br /><br />class </span><span style="color: #0000BB">Product </span><span style="color: #007700">{<br /><br />    private ?</span><span style="color: #0000BB">int $id</span><span style="color: #007700">;<br />    private ?</span><span style="color: #0000BB">string $name</span><span style="color: #007700">;<br /><br />    private 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">null</span><span style="color: #007700">, ?</span><span style="color: #0000BB">string $name </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">) {<br />        </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">;<br />        </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">;<br />    }<br /><br />    public static function </span><span style="color: #0000BB">fromBasicData</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">): static {<br />        </span><span style="color: #0000BB">$new </span><span style="color: #007700">= new static(</span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #0000BB">$name</span><span style="color: #007700">);<br />        return </span><span style="color: #0000BB">$new</span><span style="color: #007700">;<br />    }<br /><br />    public static function </span><span style="color: #0000BB">fromJson</span><span style="color: #007700">(</span><span style="color: #0000BB">string $json</span><span style="color: #007700">): static {<br />        </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">json_decode</span><span style="color: #007700">(</span><span style="color: #0000BB">$json</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />        return new static(</span><span style="color: #0000BB">$data</span><span style="color: #007700">[</span><span style="color: #DD0000">'id'</span><span style="color: #007700">], </span><span style="color: #0000BB">$data</span><span style="color: #007700">[</span><span style="color: #DD0000">'name'</span><span style="color: #007700">]);<br />    }<br /><br />    public static function </span><span style="color: #0000BB">fromXml</span><span style="color: #007700">(</span><span style="color: #0000BB">string $xml</span><span style="color: #007700">): static {<br />        </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">simplexml_load_string</span><span style="color: #007700">(</span><span style="color: #0000BB">$xml</span><span style="color: #007700">);<br />        </span><span style="color: #0000BB">$new </span><span style="color: #007700">= new static();<br />        </span><span style="color: #0000BB">$new</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">id </span><span style="color: #007700">= (int) </span><span style="color: #0000BB">$data</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">id</span><span style="color: #007700">;<br />        </span><span style="color: #0000BB">$new</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name </span><span style="color: #007700">= </span><span style="color: #0000BB">$data</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">name</span><span style="color: #007700">;<br />        return </span><span style="color: #0000BB">$new</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$p1 </span><span style="color: #007700">= </span><span style="color: #0000BB">Product</span><span style="color: #007700">::</span><span style="color: #0000BB">fromBasicData</span><span style="color: #007700">(</span><span style="color: #0000BB">5</span><span style="color: #007700">, </span><span style="color: #DD0000">'Widget'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$p2 </span><span style="color: #007700">= </span><span style="color: #0000BB">Product</span><span style="color: #007700">::</span><span style="color: #0000BB">fromJson</span><span style="color: #007700">(</span><span style="color: #0000BB">$some_json_string</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$p3 </span><span style="color: #007700">= </span><span style="color: #0000BB">Product</span><span style="color: #007700">::</span><span style="color: #0000BB">fromXml</span><span style="color: #007700">(</span><span style="color: #0000BB">$some_xml_string</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$p1</span><span style="color: #007700">, </span><span style="color: #0000BB">$p2</span><span style="color: #007700">, </span><span style="color: #0000BB">$p3</span><span style="color: #007700">);</span></span></code></div>
     </div>

    </div>
    <p class="para">
     El constructor puede ser hecho privado o protegido para evitar su llamada
     desde el exterior. En este caso, solo un método estático será capaz
     de instanciar la clase. Puesto que están en la misma definición de clase,
     tienen acceso a los métodos privados, incluso en una instancia diferente
     del objeto. Un constructor privado es opcional y puede o no tener sentido
     dependiendo del caso de uso.
    </p>
    <p class="para">
     Los tres métodos estáticos públicos demuestran entonces diferentes
     maneras de instanciar el objeto.
    </p>
    <ul class="simplelist">
     <li><code class="code">fromBasicData()</code> toma los parámetros exactos que son necesarios,
      luego crea el objeto llamando al constructor y retornando el resultado.</li>
     <li><code class="code">fromJson()</code> acepta una cadena de caracteres JSON y realiza
      un preprocesamiento sobre sí mismo para convertirse en el formato deseado por
      el constructor. Luego retorna el nuevo objeto.</li>
     <li>
      <code class="code">fromXml()</code> acepta una cadena de caracteres XML, realiza un preprocesamiento,
      luego crea un objeto bruto. El constructor es llamado, pero como todos los
      parámetros son opcionales el método los ignora. Luego asigna los
      valores a las propiedades del objeto directamente antes de retornar el resultado.
     </li>
    </ul>
    <p class="para">
     En los tres casos, la palabra clave <code class="code">static</code> es traducida al nombre de
     la clase de la cual el código se encuentra. En este caso, <code class="code">Product</code>.
    </p>
   </div>
  </div>

  <div class="sect2" id="language.oop5.decon.destructor">
   <h3 class="title">Destructor</h3>
   <div class="methodsynopsis dc-description" id="object.destruct">
    <span class="methodname"><strong>__destruct</strong></span>(): <span class="type"><a href="language.types.void.php" class="type void">void</a></span></div>

   <p class="para">
    PHP posee un concepto de destructor similar al de otros lenguajes
    orientados a objeto, como el C++. El método destructor es llamado
    tan pronto como ya no hay referencias a un objeto dado, o en cualquier orden durante la secuencia de parada.
   </p>
   <div class="example" id="example-6">
    <p><strong>Ejemplo #6 Ejemplo con un Destructor</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">MyDestructableClass<br /></span><span style="color: #007700">{<br />    function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">() {<br />        print </span><span style="color: #DD0000">"In constructor\n"</span><span style="color: #007700">;<br />    }<br /><br />    function </span><span style="color: #0000BB">__destruct</span><span style="color: #007700">() {<br />        print </span><span style="color: #DD0000">"Destroying " </span><span style="color: #007700">. </span><span style="color: #0000BB">__CLASS__ </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />    }<br />}<br /><br /></span><span style="color: #0000BB">$obj </span><span style="color: #007700">= new </span><span style="color: #0000BB">MyDestructableClass</span><span style="color: #007700">();</span></span></code></div>
    </div>

   </div>
   <p class="para">
    Al igual que el constructor, el destructor padre no será llamado
    implícitamente por el motor. Para ejecutar el destructor padre, se
    debe llamar explícitamente a la función
    <span class="function"><strong>parent::__destruct()</strong></span> en el cuerpo del destructor.
    Al igual que los constructores, una clase hija puede heredar el
    destructor del padre si no lo implementa ella misma.
   </p>
   <p class="para">
    El destructor será llamado incluso si la ejecución del script es detenida
    utilizando la función <span class="function"><a href="function.exit.php" class="function">exit()</a></span>.
    Llamar a la función <span class="function"><a href="function.exit.php" class="function">exit()</a></span>
    en un destructor evitará la ejecución de las rutinas de parada restantes.
   </p>
   <p class="para">
    Si un destructor crea nuevas referencias a su objeto, no será
    llamado una segunda vez cuando el contador de referencias alcance
    nuevamente cero o durante la secuencia de parada.
   </p>
   <p class="para">
    A partir de PHP 8.4.0, cuando la
    <a href="features.gc.collecting-cycles.php" class="link">colección de ciclos</a>
    ocurre durante la ejecución de una
    <a href="language.fibers.php" class="link">fibra</a>, los destructores de los objetos
    programados para la colección son ejecutados en una fibra distinta, llamada
    <code class="literal">gc_destructor_fiber</code>.
    Si esta fibra es suspendida, una nueva fibra será creada para ejecutar
    los destructores restantes.
    La anterior <code class="literal">gc_destructor_fiber</code> ya no será referenciada
    por el recolector de basura y podrá ser colectada si no es referenciada
    en otro lugar.
    Los objetos cuyo destructor está suspendido no serán colectados hasta
    que el destructor haya terminado o que la fibra misma sea colectada.
   </p>
   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="para">
     Los destructores llamados durante la parada del script están en una situación
     donde los encabezados HTTP ya han sido enviados.
     La carpeta de trabajo en la fase de parada del script
     puede ser diferente con ciertas APIs (ej. Apache).
    </p>
   </p></blockquote>
   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="para">
     Intentar lanzar una excepción desde un destructor (llamado al final del script)
     resulta en un error fatal.
    </p>
   </p></blockquote>
  </div>
 </div><?php manual_footer($setup); ?>