PHP 5 permite a los desarrolladores declarar métodos constructores para las clases. Aquellas que tengan un método constructor lo invocarán en cada nuevo objeto creado, lo que lo hace idóneo para cualquier inicialización que el objeto pueda necesitar antes de ser usado.
Nota: Los constructores padres no son llamados implícitamente si la clase hija define un constructor. Para ejecutar un constructor padre, se requiere invocar a parent::__construct() desde el constructor hijo. Si el hijo no define un constructor, entonces se puede heredar de la clase madre como un método de clase normal (si no fue declarada como privada).
Ejemplo #1 Utilización de nuevos constructores unificados
<?php
class BaseClass {
function __construct() {
print "En el constructor BaseClass\n";
}
}
class SubClass extends BaseClass {
function __construct() {
parent::__construct();
print "En el constructor SubClass\n";
}
}
class OtherSubClass extends BaseClass {
// heredando el constructor BaseClass
}
// En el constructor BaseClass
$obj = new BaseClass();
// En el constructor BaseClass
// En el constructor SubClass
$obj = new SubClass();
// En el constructor BaseClass
$obj = new OtherSubClass();
?>
Por motivos de retrocompatibilidad con PHP 3 y PHP 4, si PHP no puede encontrar una función __construct() de una clase dada, y la clase no hereda uno de una clase madre, se buscará la función constructora del estilo antiguo, por el nombre de la clase. Efectivamente, esto significa que en el único caso en el que se tendría compatibilidad es si la clase tiene un método llamado __construct() que fuese utilizado para diferentes semáticas.
Los constructores del estilo antiguo están OBSOLETOS en PHP 7.0, por lo que serán eliminados en una futura versión. Se debería utilizar siempre __construct() en código nuevo.
A diferencia con otros métodos, PHP no generará un mensaje de error a
nivel de E_STRICT
cuando __construct()
es sobrescrito con diferentes parámetros que los métodos padre
__construct() tienen.
A partir de PHP 5.3.3, los métodos con el mismo nombre que el último elemento de una clase en un nombre de espacios no serán más tratados como un constructor. Este cambio no afecta a clases sin espacio de nombres.
Ejemplo #2 Constructores en clases pertenecientes a un nombre de espacios
<?php
namespace Foo;
class Bar {
public function Bar() {
// Tratado como constructor en PHP 5.3.0 - 5.3.2
// Tratado como método regular a partir de PHP 5.3.3
}
}
?>
PHP 5 introduce un concepto de destructor similar al de otros lenguajes orientados a objetos, tal como C++. El método destructor será llamado tan pronto como no hayan otras referencias a un objeto determinado, o en cualquier otra circunstancia de finalización.
Ejemplo #3 Ejemplo de Destructor
<?php
class MyDestructableClass {
function __construct() {
print "En el constructor\n";
$this->name = "MyDestructableClass";
}
function __destruct() {
print "Destruyendo " . $this->name . "\n";
}
}
$obj = new MyDestructableClass();
?>
Como los constructores, los destructores padre no serán llamados implícitamente por el motor. Para ejecutar un destructor padre, se deberá llamar explícitamente a parent::__destruct() en el interior del destructor. También como los constructores, una clase child puede heredar el destructor de los padres si no implementa uno propio.
El destructor será invocado aún si la ejecución del script es detenida usando exit(). Llamar a exit() en un destructor evitará que se ejecuten las rutinas restantes de finalización.
Nota:
Los destructores invocados durante la finalización del script tienen los headers HTTP ya enviados. El directorio de trabajo en la fase de finalización del script puede ser diferente con algunos SAPIs (por ej., Apache).
Nota:
Intentar lanzar una excepción desde un destructor (invocado en la finalización del script) causa un error fatal.