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: Constructores parent no son llamados implícitamente si la clase child define un constructor. Para ejecutar un constructor parent, se requiere invocar a parent::__construct() desde el constructor child. Si el child no define un constructor, entonces se puede heredar de la clase padre 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();
// In BaseClass constructor
$obj = new OtherSubClass();
?>
Por motivos de compatibilidad, si PHP 5 no puede encontrar una función __construct() para una determinada clase y la clase no heredó uno de una clase padre, buscará el viejo estilo de la función constructora, mediante 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 propósitos.
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.