Constructores

Atención

En PHP 3 y PHP 4 los constructores se comportan de forma diferente. La semántica de PHP 4 se prefiere considerablemente.

Los constructores son funciones en una clase que son llamadas automáticamente cuando se crea una nueva instancia de una clase con new. En PHP 3, una función se convierte en constructor si tiene el mismo nombre que la clase. En PHP 4, una función se convierte en constructor cuando tiene el mismo nombre que la clase en donde es definida - la diferencia es sutil, pero crucial (vea más adelante).

<?php
// Funciona en PHP 3 y PHP 4.
class Auto_Carrito extends Carrito {
    function
Auto_Carrito() {
        
$this->agregar_item("10", 1);
    }
}
?>

Esto define una clase Auto_Carrito que es un Carrito más un constructor que inicializa el carrito con un item del número de artículo "10" cada vez que un nuevo Auto_Carrito se crea con "new". Los constructores pueden recibir argumentos y tales argumentos pueden ser opcionales, lo que los hace mucho más útiles. Para poder usar aun la clase sin parámetros, todos los parámetros deben ser opcionales, al proveer valores predeterminados.

<?php
// Funciona en PHP 3 y PHP 4.
class Constructor_Carrito extends Carrito {
    function
Constructor_Carrito($item = "10", $num = 1) {
        
$this->agregar_item ($item, $num);
    }
}

// Comprar lo mismo de antes.

$carrito_predeterminado = new Constructor_Carrito;

// Comprar esta vez en serio...

$carrito_diferente = new Constructor_Carrito("20", 17);
?>

También puede usar el operador @ para callar los errores que ocurren en el constructor, p.ej. @new.

Atención

En PHP 3, las clases derivadas y los constructores tienen un número de limitaciones. Lo siguientes ejemplos deben ser leídos cuidadosamente para entender esas limitaciones.

<?php
class A {
    function
A() {
      echo
"Soy el constructor de A.<br />\n";
    }
}

class
B extends A {
    function
C() {
        echo
"Soy una funci&oacute;n regular.<br />\n";
    }
}

// ne se esta llamando un constructor en PHP 3.
$b = new B;
?>

En PHP 3, no se está llamando un constructor en el ejemplo anterior. La regla en PHP 3 es: 'Un constructor es una función del mismo nombre que la clase.'. El nombre de la clase es B, y no hay una función llamada B() en la clase B. Nada ocurre.

Esto se corrige en PHP 4 al introducir otra regla: Si una clase no tiene constructor, el constructor de la clase base es llamado, si existe. El ejemplo anterior habría impreso 'Soy el constructor de A.<br />' en PHP 4.

<?php
class A
{
    function
A()
    {
        echo
"Soy el constructor de A.<br />\n";
    }

    function
B()
    {
        echo
"Soy una funci&oacute;n regular llamada B en la clase A.<br />\n";
        echo
"No soy un constructor en A.<br />\n";
    }
}

class
B extends A
{
    function
C()
    {
        echo
"Soy una funci&oacute;n regular.<br />\n";
    }
}

// Esto llama a B() como un constructor.
$b = new B;
?>

En PHP 3, la función B() en la clase A se convertirá de repente en un constructor en la clase B, aun cuando nunca fue esa la intención. La regla en PHP 3 es: 'Un constructor es una función con el mismo nombre de la clase.'. A PHP 3 no le importa si la función está siendo definida en la clase B, o si ha sido heredada.

Esto se corrige en PHP 4 modificando la regla a: 'Un constructor es una función del mismo nombre de la clase en la que se define.'. Por lo tanto, en PHP4, la clase B no tendría una función constructora propia y el constructor de la clase base hubiera sido llamado, imprimiendo 'Soy el constructor de A.<br />'.

Atención

Ni PHP 3 o PHP 4 llaman constructores de la clase base automáticamente desde un constructor de una clase derivada. Es su responsabilidad propagar la llamada a constructores más arriba en la jerarquía cuando sea apropiado.

Nota: No hay destructores en PHP 3 o PHP 4. Puede usar register_shutdown_function() en su lugar para emular la mayoría de efectos de los destructores.

Los destructores son funciones que son llamadas automáticamente cuando un objeto es destruido, ya sea con unset() o simplemente al finalizarse su contexto. No hay destructores en PHP.