Knowledge center Programación Entornos de programación

Un objeto debe tener sentido en cualquier momento de su ciclo de vida. Esto quiere decir que, desde el momento que se crea, sus propiedades deben tener un valor que sea coherente.

Es muy frecuente, que necesitemos realizar una serie de cálculos en el momento de la creación del objeto, para asignar los valores iniciales de sus propiedades.

En nuestra clase empleado, no tiene sentido que un trabajador comience con su propiedad salario sin establecer.

En el momento de la creación del objeto empleado, nos conectaremos a la base de datos, para recuperar cuál es su sueldo y establecer el valor correspondiente de la propiedad salario. 

Constructores

Para realizar estos procesos iniciales, tenemos los constructores de clase, que se ejecutan en el momento de la creación del objeto. Su sintaxis es la siguiente:

class nombre_clase {

     public function __construct() {
          // Acciones a realizar cuando se crea el objeto
     }

}

Parámetros en el constructor

Si lo necesitamos, podemos establecer parámetros en la función del constructor:

class nombre_clase {

     public function __construct($parametro1,$parametro2) {
          // Acciones a realizar cuando se crea el objeto
     }

}

En tal caso, es necesario indicarlos en el momento de la creación del objeto:

$nombre_objeto = new nombre_clase($valor1,$valor2);

Es obligatorio indicar el mismo número de parámetros que hemos establecido en el constructor de la clase a la hora de crear el objeto. No obstante, como sucede con cualquier función de PHP podemos establecer parámetros opcionales en el constructor.

Destructores

Del mismo modo que existen constructores de clase, existen destructores de clase, que se ejecutan cuando el objeto es destruido. Suelen utilizarse para realizar operaciones y guardados finales. Su sintaxis es la siguiente:

class nombre_clase {

     public function __destruct() {
          // Acciones a realizar cuando se destruye el objeto
     }

}

Cuándo se ejecuta un destructor de clase

Si no lo hemos hecho de manera explícita utilizando la función unset, el destructor se ejecutará cuando finalice el script de PHP. 

Vamos a ver un ejemplo completo:

Tenemos el siguiente código PHP:

<?php

     include('librerias/conexion_bbdd.php');

     $empleado1 = new empleado(3457);

     $nuevo_salario = $empleado1 -> get_salario() * 1.10;
     $empleado1 -> set_salario($nuevo_salario);

     $nuevo_salario = $empleado1 -> get_salario() * 1.10;
     $empleado1 -> set_salario($nuevo_salario);

     class empleado {

          private $salario;
          private $salario_inicial;
          private $id;

          public function __construct($numero_empleado) {
               $sql = "SELECT salario FROM empleados WHERE id = $numero_empleado";
               $datos = $GLOBALS['conexion'] -> query($sql);
               $this -> salario = $datos[0]['salario'];
               $this -> salario_inicial = $this -> salario;
               $this -> $id = $numero_empleado;
          }


          public function __destruct() {
               if ($this -> salario_inicial != $this -> salario) {
                    $sql  = 'UPDATE empleados ';
                    $sql .= 'SET salario = ' . $this -> salario . ' ';
                    $sql .= 'WHERE id = ' . $this -> $id;
                    $GLOBALS['conexion'] -> query($sql);
               }
          }


          public function set_salario($valor) {
               $this -> salario = $valor;
          }

          public function get_salario() {
               return $this -> salario;
          }

     }


?>

Al llamarlo desde el navegador se producen las siguientes acciones:
  • Se crea el objeto $empleado1 a partir de su número de empleado (3457) y se ejecuta el constructor que realiza las siguientes acciones:
    • Recupera el sueldo del empleado 3457 de la base de datos y lo almacena en la propiedad $salario.
    • También almacena el sueldo en la propiedad $salario_inicial para conocer cuál era el salario del empleado cuando se creó el objeto.
    • Guarda el número de empleado en la propiedad $id.
  • Se recupera el salario de $empleado1 con el método get_salario, se sube un 10% y se almacena de nuevo en el objeto con el método set_salario.
  • Volvemos a realizar el paso anterior, incrementando otro 10% el salario del trabajador.
  • El script finaliza, ejecutando el destructor del objeto $empleado1 que realiza las siguientes acciones:
    • Comprueba si el salario del empleado se ha modificado durante la vida del objeto.
    • En caso de haberse modificado, guarda el nuevo salario en la base de datos.

Observa que al realizar el guardado del salario en la base de datos con el destructor, en vez de hacerlo dentro del método set_salario, hemos evitado actualizar dos veces el mismo dato innecesariamente. De esta forma aumentamos la eficiencia del script.

NOTA: Para este ejemplo hemos utilizado un objeto almacenado en  $GLOBALS['conexion'] que realiza todas las peticiones a la base de datos.

Constructores y destructores
 

Esta píldora formativa está extraída del Curso online de Programación en PHP avanzada.

¿Te gusta el contenido de esta píldora de conocimiento?

No pierdas tu oportunidad y ¡continúa aprendiendo!

Política de privacidad

ADR Formación utiliza cookies propias y de terceros para fines analíticos anónimos, guardar las preferencias que selecciones y para el funcionamiento general de la página.

Puedes aceptar todas las cookies pulsando el botón "Aceptar" o configurarlas o rechazar su uso pulsando el botón "Configurar".

Puedes obtener más información y volver a configurar tus preferencias en cualquier momento en la Política de cookies