Classes e Objetos
PHP Manual

Construtores e Destrutores

Construtores

void __construct ([ mixed $args [, $... ]] )

O PHP 5 permite aos desenvolvedores declararem métodos construtores para as classes. Classes que tem 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.

Nota: 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 parent::__construct() 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).

Exemplo #1 Usando novos construtores unificados

<?php
class BaseClass {
   function 
__construct() {
       print 
"In BaseClass constructor\n";
   }
}

class 
SubClass extends BaseClass {
   function 
__construct() {
       
parent::__construct();
       print 
"In SubClass constructor\n";
   }
}

class 
OtherSubClass extends BaseClass {
    
// inherits BaseClass's constructor
}

// In BaseClass constructor
$obj = new BaseClass();

// In BaseClass constructor
// In SubClass constructor
$obj = new SubClass();

// In BaseClass constructor
$obj = new OtherSubClass();
?>

Para retrocompatibilidade com as versões do PHP 3 e 4, se o PHP não encontrar um __construct() para uma determinada classe, e a classe não herda um da classe, ele procurará pela função construtora à moda-antiga, que tenha o mesmo nome da classe. Efetivamente, isso significa que o único caso que pode gerar problemas de compatibilidade será quando a classe tiver um método chamado __construct() usado em semântica diferente.

Aviso

Construtores no estilo antigo se tornaram OBSOLETOS no PHP 7.0, e serão removidos em uma versão futura. Deve-se sempre utilizar __construct() em novos códigos.

Diferente de outros métodos, o PHP não irá gerar uma mensagem de erro de nível E_STRICT quando __construct() é sobrescrito com parâmetros diferentes do método __construct()da classe pai possuir.

A partir do PHP 5.3.3, métodos com o mesmo nome que o último elemento de uma classe com namespace não serão tratados como construtor. Esta modificação não afeta classe sem namespace.

Exemplo #2 Construtores em classes dentro de namespace

<?php
namespace Foo;
class 
Bar {
    public function 
Bar() {
        
// tratado como construtor no PHP 5.3.0-5.3.2
        // tratado como método comum a partir do PHP 5.3.3
    
}
}
?>

Destrutor

void __destruct ( void )

O PHP 5 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.

Exemplo #3 Exemplo de Destrutor

<?php
class MyDestructableClass {
   function 
__construct() {
       print 
"In constructor\n";
       
$this->name "MyDestructableClass";
   }

   function 
__destruct() {
       print 
"Destroying " $this->name "\n";
   }
}

$obj = new MyDestructableClass();
?>

Como os construtores, destrutores da classe pai não serão chamados implicitamente pelo motor. Para executar o destrutor pai, deve-se fazer uma chamada explicita a parent::__destruct() no corpo do destrutor. Assim como construtores, uma classe filha pode herdar o destrutor pai caso não implemente um.

O destrutor será chamado mesmo se o script for terminado utilizando-se exit(). Chamar exit() em um destrutor irá impedir que as demais rotinas de encerramento executem.

Nota:

Destrutores chamados durante o encerramento da execução do script tem os cabeçalhos HTTP enviados. O diretório atual na fase de encerramento do script pode ser diferente em alguns SAPIs (e.g. Apache).

Nota:

Tentar disparar uma exceção em um destrutor (chamado no término do script), causará um erro fatal.


Classes e Objetos
PHP Manual