<?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 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'language.oop5.decon.php',
    1 => 'Construtores e Destrutores',
    2 => 'Construtores e Destrutores',
  ),
  'up' => 
  array (
    0 => 'language.oop5.php',
    1 => 'Classes e Objetos',
  ),
  'prev' => 
  array (
    0 => 'language.oop5.autoload.php',
    1 => 'Autocarregamento de Classes',
  ),
  'next' => 
  array (
    0 => 'language.oop5.visibility.php',
    1 => 'Visibilidade',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    '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">Construtores e Destrutores</h2>

  <div class="sect2" id="language.oop5.decon.constructor">
   <h3 class="title">Construtores</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">
    O PHP permite aos desenvolvedores declararem métodos construtores para as classes.
    Classes que têm um método construtor chamam o método a cada
    objeto recém criado, sendo apropriado para qualquer inicialização que o
    objeto necessite antes de ser utilizado.
   </p>
   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <span class="simpara">
     Construtores pais não são chamados implicitamente se a classe filha define
     um construtor. Para executar o construtor da classe pai, uma chamada a
     <span class="function"><strong>parent::__construct()</strong></span> dentro do construtor da classe filha
     é necessária. Se a classe filha não definir um construtor, será herdado
     da classe pai como um método normal (se não foi declarado
     como privado).
    </span>
   </p></blockquote>
   <div class="example" id="example-1">
    <p><strong>Exemplo #1 Construtoras em herança</strong></p>
    <div class="example-contents">
<div class="annotation-interactive 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">"In BaseClass constructor\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">"In SubClass constructor\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">// inherits BaseClass's constructor<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #FF8000">// In BaseClass constructor<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">// In BaseClass constructor<br />// In SubClass constructor<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">// In BaseClass constructor<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">
    Diferente de outros métodos, <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a>
    não precisa seguir as regras usuais de
    <a href="language.oop5.basic.php#language.oop.lsp" class="link">compatibilidade de assinatura</a>
    em objetos derivados.
   </p>
   <p class="para">
    Construtores são métodos ordinários que são chamados durante a criação
    do objeto correspondente. Eles podem definir um número arbitrário de argumentos, quais
    podem ser obrigatórios, podem ter um tipo, e podem ter valores padrão. Argumentos de construtores
    são informados dentro de parênteses depois do nome da classe.
   </p>
   <div class="example" id="example-2">
    <p><strong>Exemplo #2 Utilizando argumentos de construtor</strong></p>
    <div class="example-contents">
<div class="annotation-interactive 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">// Passagem de ambos os argumentos.<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">// Passar somente o argumento obrigatório, $y terá o valor padrão zero.<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">// Com parâmetros nomeados (a partir do 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">
    Se a classe não tem construtor, ou o construtor não tem argumentos obrigatórios, o parêntesis
    pode ser omitido.
   </p>
   <div class="sect3">
    <h4 class="title">Construtores em estilo antigo</h4>
    <p class="para">
     Anteriormente ao PHP 8.0.0 as classes no namespace global interpretam um método com o mesmo nome
     da classe como sendo um construtor válido. Essa sintaxe foi descontinuada,
     e gerará um erro <strong><code><a href="errorfunc.constants.php#constant.e-deprecated">E_DEPRECATED</a></code></strong> embora ainda continue funcionando como um construtor.
     Se ambos o <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a> e um método homônimo da classe
     estiverem definidos, <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a> que será chamado.
    </p>
    <p class="para">
     Em classes dentro de namespaces, ou quaisquer classes a partir do PHP 8, um método
     homônimo ao nome da classe não tem um significado especial.
    </p>
    <p class="para">Sempre utilize <a href="language.oop5.decon.php#object.construct" class="link">__construct()</a> em novos códigos.
    </p>
   </div>
   <div class="sect3" id="language.oop5.decon.constructor.promotion">
    <h4 class="title">Promoção de propriedades no construtor</h4>
    <p class="para">
     A partir do PHP 8, parâmetros de construtores podem ser promovidos a uma propriedade
     do objeto. Isto é bastante comum quando parâmetros do construtor são informados
     em uma propriedade no construtor, sem nenhum processamento. Promoção de construtor
     fornece uma sintaxe reduzida para esse caso. O exemplo acima pode ser reescrito assim:
    </p>
    <div class="example" id="example-3">
     <p><strong>Exemplo #3 Utilizando promoção de propriedades no construtor</strong></p>
     <div class="example-contents">
<div class="annotation-interactive 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">
     Quanto um argumento de construtor inclui um modificador, o PHP interpreta como sendo
     uma propriedade de objeto e como um argumento do construtor, e assimilará o valor do argumento
     a uma propriedade de mesmo nome. O corpo do construtor pode estar vazio ou conter outras operações.
     Quaisquer operações serão executadas após os valores dos argumentos serem definidos
     nas respectivas propriedades.
    </p>
    <p class="para">
     Nem todos os argumentos são promovidos. É possível misturar os argumentos promovidos e não promovidos
     em qualquer ordem. Argumentos promovidos não têm impacto no código chamador do construtor.
    </p>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      Utilizar um <a href="language.oop5.visibility.php" class="link">modificador de visibilidade</a> (<code class="literal">public</code>,
      <code class="literal">protected</code> ou <code class="literal">private</code>) é o modo mais expressivo de gerar a promoção
      de propriedades, mas qualquer outro modificador (como por exemplo <code class="literal">readonly</code>) terá o mesmo efeito.
     </p>
    </p></blockquote>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      Propriedades de objeto não podem ser do tipo <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span> dado uma ambiguidade que poderia
      introduzir. Argumentos promovidos, portanto, não podem ser do tipo <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>. Quaisquer
      outra <a href="language.types.declarations.php" class="link">declaração de tipo</a> é permitida.
     </p>
    </p></blockquote>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      Propriedades promovidas são convertidas em uma propriedade normal assim como um parâmetro de função,
      portanto todas as restrições de nomeação de propriedades e parâmetros se aplicam.
     </p>
    </p></blockquote>
    <blockquote class="note"><p><strong class="note">Nota</strong>: 
     <p class="para">
      <a href="language.attributes.php" class="link">Atributos</a> informados em
      um argumento promovido será replicado tanto na propriedade como no
      no argumento. Valores padrão de argumentos promovidos no construtor serão replicados apenas no argumento, mas não na propriedade.
     </p>
    </p></blockquote>
   </div>

   <div class="sect3" id="language.oop5.decon.constructor.new">
    <h4 class="title">New em inicializadores de parâmetros</h4>
    <p class="para">
     A partir do PHP 8.1.0, objetos podem ser utilizados como valores padrão de parâmetros,
     variáveis estáticas e constantes globais, assim como argumentos de atributos.
     Novos objetos também podem ser passados na instrução <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">
      Não é permitido nomes de classe não-string ou classes anônimas.
      Não é permitido o espalhamento de argumentos.
      Não é permitido o uso de expressões.
     </p>
    </p></blockquote>
    <div class="example" id="example-4">
     <p><strong>Exemplo #4 New em inicializações</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">// Permitido:<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">// Não permitido, resulta em erro de compilação:<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">// Nome dinâmico de classe<br />    </span><span style="color: #0000BB">$b </span><span style="color: #007700">= new class {}, </span><span style="color: #FF8000">// Classe 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">// Espalhamento de argumento<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">// Expressão<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étodos de criação estáticos</h4>
    <p class="para">
     O PHP suporta apenas um único construtor por classe. Em alguns casos pode ser
     desejável de permitir a um objeto ser construído de maneiras diferentes, a partir de argumentos diferentes.
     O método recomendado para realizar isso é através de métodos estáticos, utilizados como empacotadores do construtor.
    </p>
    <div class="example" id="example-5">
     <p><strong>Exemplo #5 Utilizando métodos estáticos para construção</strong></p>
     <div class="example-contents">
<div class="annotation-interactive 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">
     O construtor pode ser privado ou protegido para evitar que ele seja chamado externamente.
     Nesses casos, apenas um construtor estático será capaz de instanciar a classe. Por estarem
     na mesma definição de classe, os métodos estáticos são capazes de instanciar o objeto, mesmo em
     uma instância diferente. O construtor privado é opcional e pode não fazer sentido em
     todos os casos.
    </p>
    <p class="para">
     Os três métodos estáticos a seguir demonstram as maneiras diferentes de instanciar um objeto.
    </p>
    <ul class="simplelist">
     <li><code class="code">fromBasicData()</code> obtém os exatos parâmetros que são necessários, e então cria
      o objeto através da chamada do construtor e retorna o resultado</li>
     <li><code class="code">fromJson()</code> aceita uma string JSON, realiza algum pré-processamento para
     converter os dados no formato necessário ao construtor. Só então retorna o novo objeto.</li>
     <li><code class="code">fromXml()</code> aceita uma string XML, pré-processa, e então cria um objeto
     limpo. O construtor é chamado, mas com todos os parâmetros opcionais o método
     os ignora. Por fim, os valores nas propriedades do objeto são associados antes de retornar o resultado.</li>
    </ul>
    <p class="para">
     Nos três casos, a palavra chave <code class="code">static</code> é convertida no nome da classe onde o código reside.
     Nesse caso a classe <code class="code">Product</code>.
    </p>
   </div>
  </div>
  <div class="sect2" id="language.oop5.decon.destructor">
   <h3 class="title">Destrutor</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">
    O PHP introduz um conceito de destrutor similar ao de outras
    linguagens orientadas a objeto, como C++. O método destrutor será chamado
    assim que todas as referências a um objeto particular forem removidas ou quando
    o objeto for explicitamente destruído ou qualquer ordem na sequência de encerramento.
   </p>
   <div class="example" id="example-6">
    <p><strong>Exemplo #6 Exemplo de Destrutor</strong></p>
    <div class="example-contents">
<div class="annotation-interactive 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">
    Assim como os construtores, os destrutores da classe pai não serão chamados implicitamente pelo
    PHP. Para executar o destrutor pai, deve-se fazer uma chamada
    explícita a <span class="function"><strong>parent::__destruct()</strong></span> no corpo do
    destrutor. Assim como construtores, uma classe filha pode herdar o destrutor
    caso não implemente um.
   </p>
   <p class="para">
    O destrutor será chamado mesmo se o script for terminado utilizando-se
    <span class="function"><a href="function.exit.php" class="function">exit()</a></span>. Chamar <span class="function"><a href="function.exit.php" class="function">exit()</a></span> em um destrutor
    irá impedir que as demais rotinas de encerramento executem.
   </p>
   <p class="para">
    Se um destrutor criar novas referências ao seu objeto, ele não será chamado
    uma segunda vez quando a contagem de referências atingir zero novamente ou durante a
    sequência de desligamento.
   </p>
   <p class="para">
    A partir do PHP 8.4.0, quando
    <a href="features.gc.collecting-cycles.php" class="link">ciclos de coleta</a>
    ocorrem durante a execução de uma
    <a href="language.fibers.php" class="link">Fiber</a>, os destrutores de objetos
    programados para coleta são executados em uma Fiber separada, chamada
    <code class="literal">gc_destructor_fiber</code>.
    Se esta Fiber for suspensa, uma nova será criada para executar quaisquer
    destrutores restantes.
    O <code class="literal">gc_destructor_fiber</code> anterior não será mais
    referenciado pelo coletor de lixo e poderá ser coletado se não for
    referenciado em outro lugar.
    Objetos cujo destrutor está suspenso não serão coletados até que o
    destrutor retorne ou a própria Fiber seja coletada.
   </p>
   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="para">
     Destrutores chamados durante o encerramento da execução do script já enviaram os cabeçalhos HTTP.
     O diretório atual na fase de encerramento do script pode ser diferente
     em alguns SAPIs (e.g. Apache).
    </p>
   </p></blockquote>
   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="para">
     Tentar disparar uma exceção em um destrutor (chamado no término
     do script), lançará um erro fatal.
    </p>
   </p></blockquote>
  </div>

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