Na teoría da POO, chámase constructor a un método que se executa cando se crea un obxeto da clase, e destructor a un método que se executa cando se destrúe un obxeto da clase.
A finalidade dun constructor é inicializar propiedades, abrir conexións a recursos a empregar na clase, … , e calquera outra operación que sexa necesario realizar antes de empregar os métodos dun obxeto desa clase. E a do destructor e a de cerrar conexión a recursos, ou recuros empregados na clase, ou calquera outra operación que sexa necesario facer antes de que o obxeto desapareza.
En PHP5 o método constructor será aquel que teña por nome __construct e o destructor aquel que teña por nome __destruct.
En PHP4 o constructor tiña por nome o nome da clase, pero cando se tiña que cambiar o nome da clase, tíñase que cambiar tamén o nome do constructor, por isto, en PHP5 cambiouse o nome dos constructores a un estandar para todas as clases (__construct). Por razóns se compatibilidade con versións anteriores, se non existe un constructor chamado __construct PHP busca un co nome da clase.
A definición do constructor ou do destructor é como a de calquera outro método (so tendo en conta a limitación no nome).
class unhaClase {
public function __construct() {
echo "Construíndo";
}
public function __destruct() {
echo "Destruíndo";
}
}
$obxeto1 = new unhaClase();
Como se dixo antes, se non se atopa o constructor __construct, buscase un como nome da clase, polo que isto, aínda que non se recomenda o seu uso, por compatibilidade funciona:
class unhaClase {
public function unhaClase() {
echo "Construíndo 2";
}
}
$obxeto1 = new unhaClase();
E unha clase que teña un constructor versión PHP5 e un versión PHP4 tamén funciona aínda que so se empregará en PHP5 o constructor __construct.
class unhaClase {
public function __construct() {
echo "Construíndo";
}
public function unhaClase() {
echo "Construíndo 2";
}
}
$obxeto1 = new unhaClase();
So se pode ter un método constructor. Se se queren ter varios, por cuestións de número e tipo de parámetros, hai que ter un só, sen parámetros, e no código do constructor identificar o número e tipo de parámetros segundo interese. Ter varios constructores produce un erro (non se pode redeclarar un método dentro da mesma clase).
class unhaClase {
public function __construct() {
echo "Construíndo con ";
echo func_num_args()." parámetros: ";
foreach (func_get_args() as $param)
echo $param. ", ";
}
}
$obxeto1 = new unhaClase();
$obxeto2 = new unhaClase(1);
$obxeto3 = new unhaClase(1,2);