En programación orientada a objetos, un objeto debe tener sentido desde el momento en que se crea. Es habitual que necesitemos realizar operaciones iniciales —como asignar valores predeterminados o consultar una base de datos— justo al instanciarlo.
En una clase Empleado
, no tendría sentido crear un objeto sin definir su salario. Podríamos usar el constructor para conectarnos a la base de datos, recuperar el sueldo del empleado y asignarlo como propiedad del objeto.
Un constructor es un método especial que se ejecuta automáticamente al crear un objeto. Su nombre es siempre __construct()
:
class NombreClase {
public function __construct() {
// Acciones al crear el objeto
}
}
Podemos pasar valores al constructor para personalizar cada objeto:
class Empleado {
public function __construct($nombre, $salario) {
$this->nombre = $nombre;
$this->salario = $salario;
}
}
//Debemos indicar los parámetros en el momento de la creación del objeto:
$empleado1 = new Empleado("Ana", 1500);
Un destructor es otro método especial que se ejecuta automáticamente cuando el objeto se destruye, por ejemplo:
unset($objeto)
Su uso habitual es liberar recursos o guardar cambios finales:
class NombreClase {
public function __destruct() {
// Acciones al destruir el objeto
}
}
Vamos a ver un ejemplo completo:
<?php
include('librerias/conexion_bbdd.php');
$empleado1 = new Empleado(3457);
// Incrementamos dos veces el salario
$nuevo_salario = $empleado1->getSalario() * 1.10;
$empleado1->setSalario($nuevo_salario);
$nuevo_salario = $empleado1->getSalario() * 1.10;
$empleado1->setSalario($nuevo_salario);
class Empleado {
private $salario;
private $salarioInicial;
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->salarioInicial= $this->salario;
$this->id = $numero_empleado; // Corregido: era $this->$id
}
public function __destruct() {
$stmt = $GLOBALS['conexion']->prepare("UPDATE empleados SET salario = ? WHERE id = ?");
if ($stmt) {
$stmt->bind_param("di", $this->salario, $this->id);
// d = double (salario), i = integer (id)
$stmt->execute();
$stmt->close();
} else {
// Puedes loguear un error aquí si la preparación falla
error_log("Error al preparar la consulta en __destruct");
}
}
public function setSalario($valor) {
$this->salario = $valor;
}
public function getSalario() {
return $this->salario;
}
}
?>
$empleado1
a partir de su número de empleado (3457) y se ejecuta el constructor que realiza las siguientes acciones: salario
.salarioInicial
para conocer cuál era el salario del empleado cuando se creó el objeto.id
.$empleado1
con el método getSalario
, se sube un 10% y se almacena de nuevo en el objeto con el método setSalario
.$empleado1
que realiza las siguientes acciones:Observa que al realizar el guardado del salario en la base de datos con el destructor, en vez de hacerlo dentro del método setSalario, 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.
Esta píldora formativa está extraída del Curso online de Programación en PHP avanzada.
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