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.
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
}
}
?>
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.